2010-12-29 24 views
6

Tôi đã đọc here, và tôi nhận thấy rằng, ví dụ, nếu tôi có các định nghĩa chức năng sau:hàm hợp Generic trong Haskell

a :: Integer->Integer->Integer 
b :: Integer->Bool 

Các biểu thức sau đây là không hợp lệ:

(b . a) 2 3 

Khá lạ là các chức năng của bố cục phải có chỉ một tham số.

Hạn chế này có phải là do một số vấn đề trong việc xác định nguyên tắc chung nhất trong Haskell hoặc có lý do nào khác không?

Tôi mới sử dụng Haskell, vì vậy, tôi đang đặt ra những câu hỏi vô dụng.

Trả lời

7

Khi bạn làm a 2 3, bạn không áp dụng a đến 2 đối số. Bạn đang thực sự áp dụng a cho đối số duy nhất của nó, dẫn đến một hàm, sau đó lấy hàm đó và áp dụng nó cho 3. Vì vậy, bạn thực sự làm 2 ứng dụng. Vì vậy, trong một nghĩa nào đó, những gì bạn có không phải là tương đương với điều này:

a :: (Integer, Integer) -> Integer 
b :: Integer -> Integer 
(b . a) (2, 3) 

Bạn có thể đã làm điều này, btw

(b . a 2) 3 
+0

Ồ, đó là mát mẻ và có ý nghĩa. Cảm ơn! – hsknew

+0

Và nếu có Integer-> Integer-> Integer-> Integer, làm thế nào tôi có thể thiết lập tham số thứ ba, và để cho hai biến 'khác'? – hsknew

+0

Bạn có thể làm '(b. A 1 2) 3', nói. Vấn đề là 'thứ' được tạo ra bởi 'a' phải nằm trong tên miền của' b' (hoặc gần như nói, cùng loại) – Phil

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