Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么部分应用程序“foldr id”会进行类型检查?_Haskell_Types_Type Inference_Fold_Partial Application - Fatal编程技术网

Haskell 为什么部分应用程序“foldr id”会进行类型检查?

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统一起来,因此我们得到,类型变量为了唯一性而不断重命

在Haskell中,我不明白为什么部分应用程序
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感谢您的编辑。仅供参考,您只需编写一次