Nếu tôi viết:foldr vs sử dụng foldr1 trong Haskell
> let xs = [1,5,19,2,-3,5]
> foldr max 0 xs
19
> foldr1 max xs
19
Và nếu tôi viết (Tôi biết, giá trị ban đầu là không chính xác vào đây để một chức năng tối đa generic ...):
> let maximum' = foldr max 0
> maximum' xs
19
Nhưng nếu tôi viết:
> let maximum2' = foldr1 max
> maximum2' xs
phản ứng là:
<interactive>:61:11:
Couldn't match expected type `()' with actual type `Integer'
Expected type: [()]
Actual type: [Integer]
In the first argument of maximum2', namely `xs'
In the expression: maximum2' xs
Tôi mới dùng Haskell. Tôi đang làm gì sai? (Không thể giải mã thông báo lỗi ...) Cách sử dụng foldr1
với max
? Cảm ơn.
EDIT (SAU KHI CHẤP NHẬN TRẢ LỜI):
Chỉ cần để hiển thị một số ví dụ khác về hiệu lực thi hành các quy tắc mặc định (câu trả lời giải thích này, quá):
Ví dụ 1:
> let max' = max
> :t max
max :: Ord a => a -> a -> a
> :t max'
max' ::() ->() ->()
Ví dụ 2:
> let plus = (+)
> :t (+)
(+) :: Num a => a -> a -> a
> :t plus
plus :: Integer -> Integer -> Integer
Hạn chế monomorphism sợ hãi. – augustss
funnily đủ ': t foldr1 max' cho' Ord a => [a] -> a' và 'cho tối đa 'l = foldr1 max l' hoạt động như mong đợi – soulcheck
@augustss thiếu liên kết đến [hạn chế monomorphism] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) – soulcheck