2009-04-12 26 views
15

Tôi đã có một cuộc đụng độ tên giữa hai mô-đun Haskell khác nhau muốn sử dụng cùng một toán tử kết hợp (<*>). Báo cáo Haskell 98 nói rằngLàm cách nào để viết tên đủ điều kiện của một biểu tượng trong Haskell?

modid.varsym 

được phép, nhưng tôi không thể làm cho nó hoạt động. Trong toàn bộ của họ vào đây là Test.hs:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

Test2.hs:

module Test2 
where 
(<*>) = 3 

Nhưng cố gắng để biên dịch kết quả trong một thông báo lỗi:

Test.hs:6:12: parse error on input `T.<*>' 

tôi đã cố gắng T.(<*>) nhưng điều đó không làm việc hoặc.

Làm cách nào tôi có thể tham chiếu đến tên biểu tượng được xác định trong mô-đun được nhập bởi import qualified?

Trả lời

15

thử

three = (T.<*>) 

Đó là lạ để xác định một nhà điều hành ghi là một số nguyên. Hãy xem xét \\ (nhà khai thác khác biệt set):

import qualified Data.List as L 

foo = [1..5] L.\\ [1..3] -- evaluates to [4,5] 
diff = (L.\\) 

Như bạn thấy ở trên, L.\\ là một nhà điều hành ghi đủ tiêu chuẩn; và nó vẫn hoạt động như một toán tử infix. Để sử dụng nó như một giá trị, bạn đặt dấu ngoặc đơn xung quanh toàn bộ điều.

+0

Weird thực sự, nhưng tôi đã cố gắng để làm ví dụ như đơn giản càng tốt. –

5

Hãy nhớ rằng chúng tôi nhập khẩu các biểu tượng được bao quanh. Ví dụ.

import T ((<*>)) 

để nhập khẩu chất lượng là như nhau:

import qualified T as Q 

main = print (Q.<*>) 
+0

Đây là một lời giải thích kỳ lạ ... dòng đầu tiên không thực sự phù hợp với phần còn lại. Chắc chắn dòng đầu tiên nên là "Hãy nhớ rằng các toán tử không được áp dụng đầy đủ cần phải được dấu ngoặc đơn". Và sau đó có 'f = (<*>)' so với 'f = (M. <*>)'. – porges

Các vấn đề liên quan