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)
我失去了关于如何了一些东西明显$和.操作?
我想这是由类型推断如何工作引起的一些限制.在基本的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工作正常时失败.