Tôi có một hàm với hai đối số mà tôi phải đối sánh với mẫu. Nếu tôi sử dụng currying trên mô hình đầu tiên nó sẽ không biên dịch:Tại sao tôi có thể cà ri một trong các mẫu nhưng không phải mẫu khác trong mẫu của tôi?
drop' :: Int -> [a] -> [a]
drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments"
drop' n (x:xs) = drop' (n-1) xs
Trình biên dịch cho kết quả này:
99.hs:106:3:
Equations for drop' have different numbers of arguments
99.hs:106:3-15
99.hs:107:3-33
In an equation for `split':
split xs n
= (take' n xs, drop' n xs)
where
take' 0 _ = []
take' n (x : xs) = x : take (n - 1) xs
drop' 0 = id
drop' n (x : xs) = drop' (n - 1) xs
Failed, modules loaded: none.
Nếu tôi chỉ cung cấp cho các mô hình cà ri, tuy nhiên, sau đó nó biên dịch:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- compiles
Điều gì mang lại?
Giả sử bạn biết bạn chỉ cần viết 'thả' 0 x = x'? – Koterpillar
Tất cả các phương trình xác định hàm phải có cùng số đối số. Vì vậy, 'thả 0 = id; thả n = \ (_: xs) -> thả (n-1) xs' sẽ biên dịch. –
[Lưu ý rằng tất cả các mệnh đề xác định một hàm phải tiếp giáp, ** và số mẫu trong mỗi mệnh đề phải giống nhau. **] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html# x10-830004.4.3) –