哈斯克尔($)是一个魔术师?

说我有以下function:

infixr 0 <| {-# INLINE (<|) #-} (<|) :: (a -> b) -> a -> b f <| x = fx foo :: a -> (forall b. b -> b) -> a foo xf = fx 

以下不input检查:

 ghci> foo 3 <| id Couldn't match expected type `forall b. b -> b' with actual type `a0 -> a0' In the second argument of `(<|)', namely `id' In the expression: f 3 <| id In an equation for `it': it = f 3 <| id 

但是, foo 3 $ id

(<|)的定义是(据我所知)与($)的定义相同。 我差不多从基础库源代码中定义了,并将($)的每个实例都改为(<|)。 编译魔法?

是的, ($)周围有less量的编译器魔术来处理impandicativetypes。 这是因为每个人都期待的

 runST $ do foo bar baz 

来检查,但它不能正常。 有关更多详细信息,请参阅此处 (searchrunST ),此电子邮件和此电子邮件 。 它的缺点是在($)types检查器中实际上有一个特殊的规则,这使得它能够解决一些常见的不确定types。