2013-03-16 35 views
7

Chơi xung quanh trong ghci tôi có các biểu hiện sau: unlines . map (\(a,b) -> show a ++ " " ++ show b)Tại sao thay đổi chữ ký sau khi chuyển nhượng

Bây giờ khi tôi kiểm tra xem nó qua :t tôi nhận được:

> :t unlines . map (\(a,b) -> show a ++ " " ++ show b) 
unlines . map (\(a,b) -> show a ++ " " ++ show b) 
    :: (Show a, Show a1) => [(a, a1)] -> String 

Vì vậy, chính xác như mong đợi. Nhưng bây giờ nếu tôi cố gắng gán nó cho một số tên, tôi nhận được một chữ ký cụ thể hơn so với bản gốc:

> let f = unlines . map (\(a,b) -> show a ++ " " ++ show b) 
> :t f 
f :: [((),())] -> String 

Tại sao điều này xảy ra?

+1

Xem thêm: [1] (http://stackoverflow.com/questions/7055146), [2] (http://stackoverflow.com/questions/11439163), [3] (http: // stackoverflow. com/questions/9714697), [4] (http://stackoverflow.com/questions/8434808), [5] (http://stackoverflow.com/questions/7799345), [6] (http: // stackoverflow .com/questions/8262020), [7] (http://stackoverflow.com/questions/8655900), [8] (http://stackoverflow.com/questions/11003535). Tôi thành thật không chắc chắn (nếu có) trong số này để đánh dấu một bản sao này. –

Trả lời

12

Do số monomorphism restriction, định nghĩa của biểu mẫu x = ... (không có tham số) được cung cấp một loại đơn (nghĩa là không đa hình), thường liên quan đến một số mặc định như đã đề cập in the other answer.

Để ngăn điều này xảy ra, hãy thêm chữ ký loại vào định nghĩa của bạn hoặc vô hiệu hóa giới hạn đơn cấu hình bằng cách sử dụng :set -XNoMonomorphismRestriction. Bạn có thể thêm số này vào số .ghci file để nó tự động chạy khi khởi động cho đến it gets disabled by default in GHCi in some future version.

+1

Hoặc mở rộng; tức là 'let f x = unlines. map (\ (a, b) -> hiển thị ++ "" ++ show b) $ x' – luqui

4

Quy tắc mặc định.

Khi bạn nhập nội dung trong GHCi, nó cố gắng áp dụng các loại mặc định. IIRC, đối với những thứ có giới hạn Num, nó chọn Integer, cho Fractional nó chọn Double và mọi thứ khác nó chọn ().

Nếu bạn viết điều này trong một tệp nguồn Haskell và tải nó vào GHCi, điều này không xảy ra (tôi tin).

Tôi nghĩ bạn cũng có thể nói điều gì đó như default Int để thay đổi các quy tắc mặc định trên cơ sở mỗi mô-đun.

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