2011-05-19 26 views
15

我开始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 

谢谢!

+0

可能重复(HTTP:/ /stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu 2015-09-10 08:34:53

回答

12

这就是所谓的monomorphism restriction

基本上,这意味着看起来像x =的顶级绑定被强制为非多态,除非您指定了类型签名。参数绑定,即f x =不受影响。有关此限制存在的详细信息,请参阅链接。

通常情况下,您会在应用限制时收到错误消息,但在此情况下,GHCi能够使用默认类型将Num a => a更改为Integer

,最简单的办法逃避它要么使用一个明确的类型签名,或把

{-# LANGUAGE NoMonomorphismRestriction #-} 

在您的模块的顶部,或-XNoMonomorphismRestriction运行GHCI。

+0

我误解了,还是应该“......被迫为非特别多态”? '让f = []'似乎可以保持它在ghci中的多态性。 – dainichi 2011-09-05 08:56:32

1

由于g定义不明确命名它的参数,你碰上monomorphism restriction,防止g被多态和(在本例中)造成GHC默认为Integer

+0

我还有一件事要学习:-)谢谢! – Frank 2011-05-19 01:05:38

3

正如其他人指出的,这是由“单态限制”引起的。

MR对Haskell编译器的作者很有用,关于在一般语言中是否值得使用它,存在争议。但是每个人都同意一件事:在GHCi提示下,MR不过是一种滋扰。

在即将发布的GHC版本中,MR在这种情况下可能会被默认关闭。现在,你应该在GHCI通过创建包含这样一行在你的home目录下名为“.ghci”的文本文件禁用它:?什么是单态的限制]的

:set -XNoMonomorphismRestriction 
相关问题