Haskell的uf = ff类型签名比我想要的更强

Sri*_*aic 16 haskell types functional-programming type-signature

我写了以下简单的函数

u f=f.f
Run Code Online (Sandbox Code Playgroud)

根据ghci这个有类型签名

u :: (b -> b) -> b -> b
Run Code Online (Sandbox Code Playgroud)

但是这种类型签名太严格了.Haskell强制要求我们的输入是(b -> b)不一定需要的类型.例如,该函数(:[])的类型签名为

(:[]) :: a -> [a]
Run Code Online (Sandbox Code Playgroud)

哪个不是形式(b -> b),(除非你允许无限​​类型)因此不能传递给u.但是你可以(:[])自己组合.

g=(:[]).(:[])
Run Code Online (Sandbox Code Playgroud)

这有效并具有类型

(:[]).(:[]) :: a -> [[a]]
Run Code Online (Sandbox Code Playgroud)

因此,我原则上应该能够将其传递给u.

我试图自己编写一个新的签名来替换生成的签名,但我无法想出一种方法来表达函数的要求.我总是提出编译器提供的相同类型签名.我们可以给出一个类型签名来削弱它,u以便(:[])可以传递给它的函数吗?

dfe*_*uer 17

对于特定情况,有许多不同的功能可以执行此操作,但通常不起作用.

u1 :: (forall a. a -> f a) -> b -> f (f b)
u2 :: (forall a. f a -> a) -> f (f b) -> b
Run Code Online (Sandbox Code Playgroud)

并且无限多是可能的.但功能

u f x = f (f x)
Run Code Online (Sandbox Code Playgroud)

具备时,在Haskell一个最普遍的类型RankNTypes是在玩.正如Pigworker所说,有些类型系统可以提供u您想要的类型的主要类型,但是它们采用类型系统扩展,与Haskell设计者关注的方向完全不同.

  • 写`&`for intersection,`((a - > b)&(b - > c)) - >(a - > c)`. (6认同)
  • @pigworker - *所有*非平凡的一致类型系统不允许有意义的事情.这是哥德尔不完备性定理的直接结果. (3认同)