令我感到困惑的是,haskell编译器有时会推断出比我预期的更不易变形的类型,例如在使用无点定义时.
似乎问题是"单态限制",默认情况下在旧版本的编译器上启用.
考虑以下haskell程序:
{-# LANGUAGE MonomorphismRestriction #-}
import Data.List(sortBy)
plus = (+)
plus' x = (+ x)
sort = sortBy compare
main = do
print $ plus' 1.0 2.0
print $ plus 1.0 2.0
print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)
如果我编译它,ghc我没有获得错误,可执行文件的输出是:
3.0
3.0
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
如果我将main身体改为:
main = do
print $ plus' 1.0 2.0
print $ plus (1 :: Int) 2
print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我没有编译时错误,输出变为:
3.0
3
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
正如所料.但是,如果我尝试将其更改为:
main = do
print $ …Run Code Online (Sandbox Code Playgroud) polymorphism haskell types type-inference monomorphism-restriction