Fra*_*ank 15 haskell types monomorphism-restriction
我正在开始Haskell ...我尝试用两种不同的方式编写以下简单的函数,让Haskell决定类型,类型系统在每种情况下都做了不同的事情.这种行为的解释是什么?
Prelude> let f x = 2 * x
Prelude> let g = (2*)
Prelude> :info f
f :: Num a => a -> a -- Defined at <interactive>:1:5
Prelude> :info g
g :: Integer -> Integer -- Defined at <interactive>:1:5
Run Code Online (Sandbox Code Playgroud)
谢谢!
ham*_*mar 12
这被称为单态限制.
基本上,它意味着看起来像的顶级绑定x =
被强制为非多态,除非您指定类型签名.带参数的绑定,即f x =
不受影响.有关此限制存在的原因,请参阅链接.
通常,在应用限制时会收到错误消息,但在这种情况下,GHCi可以使用类型默认将类型更改Num a => a
为Integer
.
躲避它的最简单方法是使用显式类型签名,或者放置
{-# LANGUAGE NoMonomorphismRestriction #-}
Run Code Online (Sandbox Code Playgroud)
在模块的顶部,或运行GHCi -XNoMonomorphismRestriction
.
归档时间: |
|
查看次数: |
1227 次 |
最近记录: |