gpt4 book ai didi

haskell - 与 id 组合如何更改类型

转载 作者:行者123 更新时间:2023-12-02 02:51:03 25 4
gpt4 key购买 nike

foldr的类型是

> :t foldr
forall a b. (a -> b -> b) -> b -> [a] -> b


> :t id
forall a. a -> a

那么我会期待 foldr (.) id具有与 foldr 相同的类型, 而不是
> :t foldr (.) id
forall b. [b -> b] -> b -> b

看来我对组合的工作方式有误解,因为我认为对于函数 f那个 f . id会给 f(id(x)) == f(x) ,保留 f 的类型.我有什么误解可以澄清 foldr (.) id 的含义和更一般的组成?

最佳答案

这不是与 id 的组合,正如您从 foldr . id 得到的一样(注意没有括号)。那确实相当于 foldr单独,也许是范畴论中最重要的等价物,因此也是 Haskell 的基础。

相反,你在那里所做的是,通过了 (.)id作为 foldr 的参数: 把 . in parens 使它只是另一个表达式,所以普通的 Haskell 函数解析适用,即贪婪地使用连续的术语作为第一个的参数。你很幸运,这完全是一个很好的类型,例如 succ (.) id会给出 absurd 的签名Enum ((c -> c) -> (a -> c) -> a -> c) => (a -> c) -> a -> c .

它如何与 foldr 一起使用可以通过写作看到

 (.) :: (y->z) -> (x->y) -> (x->z)

统一 (x->y) = (x->z)foldr的参数,即 y = z ,
 (.) :: (y->y) -> (x->y) -> (x->y)

foldr (.) :: (x->y) -> [y->y] -> (x->y)

然后 id还需要 x = y ,
 foldr (.) id :: [x->x] -> (x->x)

关于haskell - 与 id 组合如何更改类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23962508/

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