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

den*_*mal 3 syntax haskell types

我有一个表达:

gcastWith p1 $
gcastWith p2 $
e
Run Code Online (Sandbox Code Playgroud)

这没问题.现在我试图将其重写为:

((gcastWith p1) .
 (gcastWith p2)) $
e
Run Code Online (Sandbox Code Playgroud)

它不起作用(不是类型检查).但是这有效:

((gcastWith p1) .
 (gcastWith p2)) -- note I removed the dollar
e
Run Code Online (Sandbox Code Playgroud)

我失去了关于如何了一些东西明显$.操作?

chi*_*chi 7

我想这是由类型推断如何工作引起的一些限制.在基本的Hindley-Milner类型中

f :: (forall a. G a) -> T
Run Code Online (Sandbox Code Playgroud)

是被禁止的.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
Run Code Online (Sandbox Code Playgroud)

由于f $ e非常 Haskell中常见的,并且我们真正想要的东西喜欢runST $ do ....到工作中,开发者GHC已经添加了特殊情况下的打字规则$.基本上,当完全应用时,f $ e键入类似f e.

目前打字系统中没有这种特殊情况f . g . h $ e.这可以使它在f $ g $ h $ e工作正常时失败.