【发布时间】:2015-03-22 10:38:02
【问题描述】:
Prelude> let myprint = putStrLn . show
Prelude> :t myprint
myprint :: () -> IO ()
好的,这里没什么不寻常的。只是 GHCi 类型的默认规则,我猜...
Prelude> let myprint = (putStrLn . show) :: Show x => x -> IO ()
Prelude> :t myprint
myprint :: () -> IO ()
这是什么魔法??你直接忽略我的类型声明?! O_O
有什么方法可以说服 GHCi 做我真正想做的事吗?
【问题讨论】:
-
疯狂猜测:可怕的单态限制。
-
@Jubobs 这也是我的猜测 - 除了显式类型签名没有禁用它吗?
-
您使用的是旧版本的 GHC 吗?我在 7.8.3 上,我得到了你通常期望的类型签名 (
Show a => a -> IO ()),即使没有使用签名表达式。获取() -> IO ()似乎是 GHC 的一个实际问题。 -
在 GHCi 7.8.1 中默认关闭了单态限制(仅适用于 GHCi),请参阅downloads.haskell.org/~ghc/7.8.1/docs/html/users_guide/…。
-
@MvanGeest 是因为SO问题的数量吗? ;-)