gpt4 book ai didi

function - 函数 Haskell 的类型推断

转载 作者:行者123 更新时间:2023-12-02 08:34:01 26 4
gpt4 key购买 nike

我正在尝试推断以下类型:

((.) 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')当您无法删除原始文件夹中的那些时,为什么我可以删除它们,并且该功能将成为 foldr 的输入。为什么在应用了复合仿函数之后就可以使用偏应用了?有这样的规则吗?另外我想如果有人可以确认或拒绝“非贪婪”类型匹配..

最佳答案

->的结合性

在 Haskell 中,函数的唯一类型是 a -> b,这是一个接受 a 并“返回”a b 的函数>。为此,函数类型为:

a -> b -> c

是隐含的:

a -> (b -> c)

这是一个接受 a 并返回一个接受 b 并返回 c 的函数。你只需要记住 ->right associative .这是允许柯里化(Currying)的“机制”。

答案

How do i know which to take?

因此,在您的示例中:

foldr:: (a' -> b' -> b') -> b' -> [a'] -> b'

变成:

foldr:: (a' -> b' -> b') -> (b' -> ([a'] -> b'))

如您所见,推断类型 a -> b 的唯一方法是将 (a'->b'->b') 分配给 a(b'->([a']->b'))b


Why can I remove them when you cannot remove those in the original foldr, and the function is gonna be an input for foldr?

因为函数组合后,类型为:

(a -> (a' -> b' -> b')) -> a -> b' -> [a'] -> b'
-- ^^^^^^^^^^^^^^^^^^^^

让我们关注第一部分:

(a -> (a' -> b' -> b'))

这是,对于 -> 的右结合性,等于:

(a -> (a' -> (b' -> b')))

也等于:

(a -> a' -> b' -> b')

对于相同的关联规则。


Why after applying the composition functor you can use partial application? Is there a rule for that?

当您有一个函数接受超过 1 个“参数”时(或者更准确地说,当您有一个返回函数的函数时),始终可以应用部分应用。

关于function - 函数 Haskell 的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23634769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com