Haskell 为什么部分应用程序“foldr id”会进行类型检查?
在Haskell中,我不明白为什么部分应用程序Haskell 为什么部分应用程序“foldr id”会进行类型检查?,haskell,types,type-inference,fold,partial-application,Haskell,Types,Type Inference,Fold,Partial Application,在Haskell中,我不明白为什么部分应用程序foldr idtypechecks 相关类型包括 :t foldr id foldr id::a->[a->a]->a >:t foldr foldr::(a->b->b)->b->a]->b >:t id id::a->a foldr的第一个参数是(a->b->b)。相反,id的类型是a->a。它们不应该兼容。因为a->b->b实际上是a->(b->b) 由于id::a->a,这将a与b->b统一起来,因此我们得到,类型变量为了唯一性而不断重命
foldr id
typechecks
相关类型包括
:t foldr id
foldr id::a->[a->a]->a
>:t foldr
foldr::(a->b->b)->b->a]->b
>:t id
id::a->a
foldr
的第一个参数是(a->b->b)
。相反,id
的类型是a->a
。它们不应该兼容。因为a->b->b
实际上是a->(b->b)
由于id::a->a
,这将a
与b->b
统一起来,因此我们得到,类型变量为了唯一性而不断重命名
foldr :: (a -> (b -> b)) -> b -> [ a ] -> b
id :: c -> c
----------------------------------------------- |- a ~ c , c ~ b -> b
foldr id :: b -> [ c ] -> b
foldr id :: b -> [b -> b] -> b
就这些
那么它有什么作用呢
foldr f z [x, y, ..., n] = f x (f y (... (f n z)...))
= x `f` y `f` ... n `f` z -- infixr _ `f`
foldr id z [x, y, ..., n] =
= id x (id y ( ... (id n z )...))
= x ( y ( ... ( n ( id z))...))
= ( x . y . ... . n . id ) z
= foldr (.) id [x,y,...,n] z
因此,
foldr id=foldr($)=flip(foldr(.)id)
这非常好。由于输出和输入类型匹配,列表中保存的函数都会堆叠起来。:t id::(a->a)->(a->a)
可能很有启发性。@ChadGilbert感谢您的编辑。仅供参考,您只需编写一次
。