派生类型(foldr(。)) [英] Deriving the type of (foldr (.))

查看:124
本文介绍了派生类型(foldr(。))的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图手动派生类型(foldr(。))

  foldr ::(a1  - > ; b1-> b1) - > b1  - > [a1]  - > b1 
(。)::( b2-> c2) - > (a2→b2)→> a2 - > c2

然后:

  a1〜(b2  - > c2)
b1〜(a2 - > b2)
b1〜a2

所以我得到(foldr(。))::(a2 - > b2) - > [(b2→c2)]→> (a2 - > b2)



但GHCi返回::t(foldr(。))::( a - > b) - > [b - > b] - > a - > b



为什么b2和c2是相同的?

谢谢, >
Sebastián。

解决方案

如果您查看
$ b (b2 - > c2) - > (a2→b2)→> (a2 - > c2)

然后

  b1〜(a2  - > b2)
b1〜(a2 - > c2)

so (b2〜c2)



然后你就可以看到(foldr(。))的类型是

 (a2  - > b2) - > [(b2→b2)]→> (a2  - > b2)

这是GHC的类型。 b

I'm trying to manually derive the type of (foldr (.))

foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(.) ::(b2 -> c2) -> (a2 -> b2) -> a2 -> c2

Then:

a1 ~ (b2 -> c2)
b1 ~ (a2 -> b2)
b1 ~ a2

So I get that (foldr (.)) :: (a2 -> b2) -> [(b2 -> c2)] -> (a2 -> b2)

But GHCi returns: :t (foldr (.)) :: (a -> b) -> [b -> b] -> a -> b

Why b2 and c2 are the same?

Thanks,
Sebastián.

解决方案

If you look at the type of (.) as

(b2 -> c2) -> (a2 -> b2) -> (a2 -> c2)

then

b1 ~ (a2 -> b2)
b1 ~ (a2 -> c2)

so (b2 ~ c2)

then you can see the type of (foldr (.)) is

(a2 -> b2) -> [(b2 -> b2)] -> (a2 -> b2)

which is the type GHC derives.

这篇关于派生类型(foldr(。))的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆