哈斯克尔($)是一个魔术师?
说我有以下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。