折叠功能:
fold :: b -> (a -> b -> b) -> [a] -> b
fold z f [] = z
fold z f (x:xs) = f x (fold z f xs)
Run Code Online (Sandbox Code Playgroud)
取自http://www.seas.upenn.edu/~cis194/spring13/lectures/04-higher-order.html
Prelude> :t (+)
(+) :: Num a => a -> a -> a
*Main> fold (0) (+) [1,2,3]
6
Run Code Online (Sandbox Code Playgroud)
这是什么类型的(a -> b -> b) 匹配类型a -> a -> a的(+)功能?
由于折叠定义接受函数类型,(a -> b -> b)这意味着前两个参数(a -> b)需要是不同类型的?
Sib*_*ibi 15
不,它的意思是,a和b 可以是不同的,但它不是强制性的它是不同的.在你的情况下,它是相同的.
一个更简单的例子来传达这一点:
data SomeType a b = Test a b deriving (Show)
Run Code Online (Sandbox Code Playgroud)
现在ghci:
?> :t Test
Test :: a -> b -> SomeType a b
?> let x = Test (3 :: Int) (4 :: Int)
?> :t x
x :: SomeType Int Int
Run Code Online (Sandbox Code Playgroud)