给定以下定义:
import Control.Monad.ST
import Data.STRef
fourty_two = do
x <- newSTRef (42::Int)
readSTRef x
以下在 GHC 下编译:
main = (print . runST) fourty_two -- (1)
但这不会:
main = (print . runST) $ fourty_two -- (2)
但是正如bdonlan在评论中指出的那样,这确实可以编译:
main = ((print . runST) $) fourty_two -- (3)
但是,这不会编译
main = (($) (print . runST)) fourty_two -- (4)
这似乎表明 (3) 仅由于对 infix 的特殊处理而编译$
,但是,它仍然没有解释 (1) 编译的原因。
问题:
1)我已经阅读了以下两个问题(第一个,第二个),并且我被引导相信$
只能用单态类型实例化。但我同样会假设.
只能用单态类型实例化,结果同样会失败。为什么第一个代码成功但第二个代码没有?(例如,对于第一种情况,GHC 是否有不能在第二种情况下适用的特殊规则?)
2) 是否有编译第二个代码的当前 GHC 扩展?(也许ImpredicativePolymorphism在某些时候做到了这一点,但它似乎已被弃用,有什么替代它的吗?)
3)有什么方法可以定义说`my_dollar`
使用 GHC 扩展来做什么$
,但也能够处理多态类型,所以(print . runST) `my_dollar` fourty_two
编译?
编辑:建议的答案:
此外,以下无法编译:
main = ((.) print runST) fourty_two -- (5)
这与 (1) 相同,除了不使用.
.
结果,似乎 GHC 对$
和都有特殊规则.
,但只有它们的中缀版本。