读“真实世界哈斯克尔”,95页的作者提供了一个例子:函数获取四个参数而不是三个 - 为什么不打破?
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
我的问题是:为什么这个代码编译? foldr
只需要三个参数 - 但在这里,它通过四个:step
,id
,xs
,z
。
例如,这不起作用(因为总和预计一个):
sum filter odd [1,2,3]
相反,我必须写:
sum $ filter odd [1,2,3]
我不明白你为什么可以做'id id 5',但是你不能这样做:'foo x = x + 1;条y = y + 1; foo bar 1'? – drozzy 2012-02-11 23:46:32
@drozzy - 这一切都是关于类型和多态的。以'id :: a - > a':你可以用* any替换'a'。然而,'foo'是不同的,因为它有约束:它需要一个数字:'foo ::(Num a)=> a - > a'。 'bar ::(Num a)=> a - > a'不是'Num'类型类型的实例,因此不符合'foo'的'(Num a)'约束。 – 2012-02-11 23:51:03
@drozzy如果我们澄清函数应用程序的关联性,也许会有所帮助!请记住'id id 5'解析为'(id id)5' - 也就是说,首先将'id'作为'id'的参数,然后将'5'作为结果的参数 - 而不是' id(id 5)'。 – 2012-02-12 01:26:09