2017-01-05 13 views
11

Trong chương trình Haskell này, @@ là toán tử kết xuất mà tôi muốn xác định chỉ cục bộ trong phần chức năng f. (Đương nhiên đủ, chương trình thực tế của tôi là phức tạp hơn này, và có một lý do chính đáng để sử dụng ký hiệu ghi vào.)Định nghĩa toán tử cục bộ trong Haskell

infixl 5 @@ 

(@@) = undefined 

f x = x @@ 5 where x @@ y = (x+1) * (y+1) 

main = print (f 7) 

Tuy nhiên, trừ khi tôi cũng làm cho các định nghĩa toàn cầu, được viết ở đây là (@@) = undefined, GHC phàn nàn rằng 'Chữ ký cố định cho @@ thiếu ràng buộc kèm theo'. Có cách nào để làm tròn điều này mà không có định nghĩa toàn cầu về ký hiệu toán tử không?

+1

là 'bạn infixl 5 @@' thực sự đang được áp dụng cho các địa phương '(@@)'? Bởi vì đó phải là một lỗi tôi sẽ nghĩ rằng – jberryman

+0

có vẻ như nó không phải là – jberryman

Trả lời

16

Chỉ cần đặt việc kê khai tính cố định trong mệnh đề where dường như làm việc tốt:

f x = x @@ 5 where 
    infixl 5 @@ 
    x @@ y = (x+1) * (y+1) 
+2

Tôi vừa mới đăng bài này. Theo Báo cáo Haskell 2010, 100% hợp pháp để đưa các khai báo cố định vào vị trí chặn. Đáng ngạc nhiên, nhưng đúng. – MathematicalOrchid

+0

Ooh, tôi không nghĩ về điều đó! –

+0

... và tôi cho rằng tôi không nghĩ về nó bởi vì với tư cách là một nhà biên dịch trình biên dịch, tôi sẽ không thích thực hiện điều đó, hoặc cố gắng thực hiện và tạo ra các thông báo lỗi hợp lý khi nó sai. Tất nhiên nó có thể được thực hiện, nhưng đó là một công việc cho một ai đó với sự nhiệt tình trẻ trung hơn tôi sở hữu. –

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