gpt4 book ai didi

Haskell 的 u f=f.f 类型签名比我想要的要强

转载 作者:行者123 更新时间:2023-12-03 14:09:04 26 4
gpt4 key购买 nike

我写了以下简单的函数

u f=f.f

根据 ghci这具有类型签名
u :: (b -> b) -> b -> b

但是,该类型签名太严格了。 Haskell 强制我们的输入类型为 (b -> b)当它不一定需要时。例如函数 (:[])具有类型签名
(:[]) :: a -> [a]

不是 (b -> b) 的形式, (除非您允许无限类型),因此不能传递给 u .但是您可以撰写 (:[])与自己。
g=(:[]).(:[])

这有效并且具有类型
(:[]).(:[]) :: a -> [[a]]

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

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

最佳答案

有许多不同的功能可以针对特定情况执行此操作,但一般都没有。

u1 :: (forall a. a -> f a) -> b -> f (f b)
u2 :: (forall a. f a -> a) -> f (f b) -> b

并且无限更多是可能的。但是功能
u f x = f (f x)

RankNTypes 时在 Haskell 中没有最通用的类​​型正在玩。正如 pigworker 所指出的,有些类型系统可以提供 u一种您想要的基本类型,但它们采用类型系统扩展的方向与 Haskell 设计师所关注的方向截然不同。

关于Haskell 的 u f=f.f 类型签名比我想要的要强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037709/

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