gpt4 book ai didi

haskell - '.' 和 '$' 之间的等价

转载 作者:行者123 更新时间:2023-12-02 14:41:27 24 4
gpt4 key购买 nike

我有一个表达:

gcastWith p1 $
gcastWith p2 $
e

效果不错。现在我尝试将其重写为:

((gcastWith p1) .
(gcastWith p2)) $
e

它不起作用(不进行类型检查)。然而这有效:

((gcastWith p1) .
(gcastWith p2)) -- note I removed the dollar
e

我是否遗漏了一些关于 $. 如何运作的明显信息?

最佳答案

我猜这是类型推断的工作方式造成的一些限制。在基本的 Hindley-Milner 类型中,例如

f :: (forall a. G a) -> T

被禁止。 GHC Haskell 允许它们(打开合适的扩展),但仍然使用 HM 限制,要求类型变量永远不能实例化为多类型。

这会引起一些意外:f e类型检查但 f $ e失败,因为类型变量的类型为 $应该实例化为多类型。

e :: forall a. G a
f :: (forall a. G a) -> T
f e :: T

($) :: (b -> c) -> b -> c

Type checking ($) f e:

b ~ (forall a. G a) -- forbidden polytype!
c ~ T

f $ e在 Haskell 中非常很常见,我们真的想要像 runST $ do .... 这样的东西为了工作,GHC 开发人员添加了 $ 的特殊情况键入规则。 。本质上,完全应用后,f $ e输入类似 f e .

f . g . h $ e 的打字系统中不存在这种特殊情况。眼下。当 f $ g $ h $ e 时,这可能会导致失败。工作正常。

关于haskell - '.' 和 '$' 之间的等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585563/

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