【问题标题】:Haskell's ($) is a magic operator?Haskell 的 ($) 是魔术运算符吗?
【发布时间】:2013-12-27 06:11:14
【问题描述】:

假设我有以下功能:

infixr 0 <|

{-# INLINE (<|) #-}
(<|) :: (a -> b) -> a -> b
f <| x = f x

foo :: a -> (forall b. b -> b) -> a
foo x f = f x

以下不检查类型:

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 确实

(

【问题讨论】:

    标签: haskell


    【解决方案1】:

    是的,($) 周围有少量编译器魔法来处理不可谓语类型。之所以引入,是因为大家都期待

    runST $ do
      foo
      bar
      baz
    

    进行类型检查,但它不能正常进行。有关详细信息,请参阅here(搜索runST)、此email 和此email。简而言之,在类型检查器中实际上有一条专门针对 ($) 的特殊规则,这使它能够解决禁言类型的常见情况。

    【讨论】:

    • 好吧,我希望重命名 ($) 运算符。无论如何,谢谢:)只要让我……你就会得到复选标记......
    • 另外,与答案本身无关,很好的发现。很难注意到这种特殊的编译器魔法。
    • @YellPika 可悲的是,如果你使用太多更高等级的类型,你就会被它困住。
    • trac 页面只是说 GHC 进行从左到右的实例化,而不是它的特殊情况 ($)。它实际上只为($) 做吗?
    • 这是 Simon PJ 谈论不可预测性检查和 ($) 快捷方式的电子邮件 haskell.org/pipermail/glasgow-haskell-users/2010-November/…
    猜你喜欢
    • 2022-07-13
    • 2014-01-19
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多