9

如果我写:

> let xs = [1,5,19,2,-3,5]
> foldr max 0 xs
19

> foldr1 max xs
19

如果我写(我知道,这里的初始值对于通用最大函数是不正确的......):

> let maximum' = foldr max 0
> maximum' xs
19

但如果我写:

> let maximum2' = foldr1 max
> maximum2' xs

回应是:

<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

我是 Haskell 的新手。我究竟做错了什么?(无法破译错误信息...)如何使用foldr1with max?谢谢。

编辑(接受答案后):

只是为了展示更多关于默认规则效果的示例(答案也解释了这些):

示例 1:

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

> :t max' 
max' :: () -> () -> ()

示例 2:

> let plus = (+)
> :t (+)
(+) :: Num a => a -> a -> a

> :t plus 
plus :: Integer -> Integer -> Integer
4

1 回答 1

13

问题在于类型的多态性和 GHCi 的默认设置。的类型max是多态的:

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

在 的情况下maximum',编译器可以看到这a是某种数字,而 GHCi 将数字默认为整数:

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

maximum2'线索较少的情况下,默认a为单位类型:

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

如果您提供类型签名,一切都很好:

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

我认为 GHCi 的默认规则可以使省略类型的某些其他情况更容易 - 请参阅http://www.haskell.org/ghc/docs/7.6.2/html/users_guide/interactive-evaluation.html#id484837

于 2013-09-06T16:10:23.320 回答