2011-12-28 23 views
8

Khi làm việc trong các phiên dịch, nó thường thuận tiện để ràng buộc một chức năng để một tên, ví dụ:Khi nào tôi có thể liên kết một chức năng với một tên khác?

ghci> let f = (+1) 
ghci> f 1 
2 

Đây là bí danh tên f đến chức năng (+1). Đơn giản.

Tuy nhiên, điều này không phải lúc nào cũng hiệu quả. Một ví dụ tôi đã tìm thấy gây ra lỗi đang cố gắng bí danh nub từ mô-đun Data.List. Ví dụ,

ghci> :m Data.List 
ghci> nub [1,2,2,3,3,3] 
[1,2,3] 
ghci> let f = nub 
ghci> f [1,2,2,3,3,3] 

<interactive>:1:14: 
    No instance for (Num()) 
     arising from the literal `3' 
    Possible fix: add an instance declaration for (Num()) 
    In the expression: 3 
    In the first argument of `f', namely `[1, 2, 2, 3, ....]' 
    In the expression: f [1, 2, 2, 3, ....] 

Tuy nhiên, nếu tôi một cách rõ ràng nêu rõ lập luận x sau đó nó hoạt động mà không có lỗi:

ghci> let f x = nub x 
ghci> f [1,2,2,3,3,3] 
[1,2,3] 

Bất cứ ai có giải thích hành vi này?

+7

Xem [câu hỏi này và câu trả lời của câu hỏi này] (http://stackoverflow.com/questions/4575040/what-is-xnomonomorphismrestriction). – gspr

+0

Cảm ơn. Nếu bạn đăng đó như một câu trả lời (có thể là một chút mở rộng) thì tôi chấp nhận nó. –

+1

Không, tín dụng nơi đến hạn của tín dụng (tức là câu trả lời tôi đã liên kết). :-) – gspr

Trả lời

3

Nhập quy tắc mặc định trong phiên bản Ghci hiện tại có phần không thể hiểu được.

Bạn có thể cung cấp chữ ký loại cho f. Hoặc thêm :set -XNoMonomorphismRestriction vào tệp ~/.ghci của bạn như đã được Chris khuyên trước đó.

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