Haskell 的 ($) 是一个神奇的运算符?

标签 haskell

假设我有以下功能:

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

(<|) 的定义(据我所知)与 ($) 的定义相同。我几乎从基础库源中删除了定义,并将 ($) 的每个实例更改为 (<|)。编译器魔法?

最佳答案

是的,($) 周围有少量编译器魔法来处理谓语类型。推出是因为大家都期待

runST $ do
  foo
  bar
  baz

进行类型检查,但不能正常进行。欲了解更多详情,请参阅here (搜索runST),这个email ,还有这个email 。缺点是,类型检查器中实际上有一条专门针对 ($) 的特殊规则,它能够解决谓语类型的常见情况。

关于Haskell 的 ($) 是一个神奇的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20795747/

相关文章:

haskell - 显示与 unsafeCoerced 值一起使用时返回错误值

haskell - 如何概括这种就地选择排序?

haskell - 以无序元组为键的映射

Haskell:读取包含 Int 和 Float 的行的简单方法?

haskell - 如何使用 `zipTree` 实现 `foldTree` ?

java - Haskell 数据类型到 Java(OO)

haskell - 如何指定子表达式的多态类型?

haskell - 运行时错误-功能中的非穷举模式

haskell - 编写我自己的最小功能,无法修复错误

haskell - Haskell 中 id 函数的类型