2013-09-06 30 views
9

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 
+7

Hạn chế monomorphism sợ hãi. – augustss

+1

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

+3

@augustss thiếu liên kết đến [hạn chế monomorphism] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) – soulcheck

Trả lời

13

Vấn đề là phải làm với tính đa hình của các loại và mặc định của GHCi. Các loại max là đa hình:

> :t max 
max :: Ord a => a -> a -> a 

Trong trường hợp của maximum', trình biên dịch có thể thấy rằng a là một số loại số, và GHCi mặc định số lượng để Integer:

> :t maximum' 
maximum' :: [Integer] -> Integer 

Trong trường hợp của maximum2' nó có manh mối ít hơn, và mặc định a với loại đơn vị:

> :t maximum2' 
maximum2' :: [()] ->() 

Nếu bạn provid e một loại chữ ký, tất cả là tốt:

> let maximum3' :: Ord a => [a] -> a ; maximum3' = foldr1 max 
> :t maximum3' 
maximum3' :: Ord a => [a] -> a 

Tôi nghĩ quy tắc mặc định GHCi của đang có để làm cho một số trường hợp khác, nơi mà các loại được bỏ qua dễ dàng hơn - xem http://www.haskell.org/ghc/docs/7.6.2/html/users_guide/interactive-evaluation.html#id484837

+0

Wow! Câu trả lời rất hữu ích, cảm ơn! Và liên kết cũng rất hữu ích! – TFuto

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