【发布时间】:2014-05-13 14:57:10
【问题描述】:
我试图推断以下类型:
((.) foldr)
我手动推断的类型与一个 ghci 推断不同。这是我的工作:
(.) :: ( b -> c) -> (a->b)->a->c
foldr:: (a'->b'->b')->b'->[a']->b'
现在我的第一个疑问。 Foldr 必须与 b->c 统一 foldr 必须与 (b->c) 统一,但实现它的方法不止一种;喜欢
b ~ (a'->b'->b')
c ~ b'->[a']->b'
或者..
b ~ (a'->b'->b')b'->[a']
c ~ b'
我怎么知道要吃哪个?
在 ghci 中做不同的例子,我得出的结论是,haskell 试图以非贪婪的方式统一第一个参数的类型(这个结论完全是实验性的,可能是完全错误的,也许这是我得出错误类型的原因对于函数,但这是我在haskell上尝试过的类型推断的想法)。所以,假设这是真的,配置haskell首先尝试统一是:
b ~ (a'->b'->b')
c ~ b'->[a']->b'
那么现在..
(.)foldr :: (a->b)->a->c
代入 b 和 c:
(.)foldr :: (a-> (a'->b'->b') )->a->b'->[a']->b'
这足够接近我唯一的问题是表达式中的括号 (a'->b'->b') 当您无法删除原始文件夹中的那些时,为什么我可以删除它们,并且该功能将成为文件夹的输入。为什么在应用合成函子后可以使用部分应用?有这样的规定吗? 我也想如果有人可以确认或拒绝“非贪婪”类型匹配..
【问题讨论】: