首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个ghci会话中的类型发生了什么?

这个ghci会话中的类型发生了什么?
EN

Stack Overflow用户
提问于 2012-06-13 03:31:26
回答 1查看 400关注 0票数 21

我正在学习Haskell,当我在ghci中玩耍时,我遇到了一些非常令人费解的事情。

首先,创建一个简单的add函数:

代码语言:javascript
复制
Prelude> let add x y = x + y

注意,它适用于整型和浮点型:

代码语言:javascript
复制
Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8

现在创建一个apply函数。它与$相同(但不是infix)。它的工作方式就像add上的no-op:

代码语言:javascript
复制
Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8

好的,现在创建与add'相同但使用applyadd'

代码语言:javascript
复制
Prelude> let add' = apply add
Prelude> add' 3 4
7
Prelude> add' 2.5 1.3

<interactive>:1:9:
    No instance for (Fractional Integer)
      arising from the literal `1.3' at <interactive>:1:9-11
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `add'', namely `1.3'
    In the expression: add' 2.5 1.3
    In the definition of `it': it = add' 2.5 1.3

Wat.

以下是这些类型:

代码语言:javascript
复制
Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add'
add' :: Integer -> Integer -> Integer
Prelude> 

为什么add'具有与apply add不同的类型

这是ghci的奇怪之处,还是在Haskell中普遍如此?(我怎样才能区分它们呢?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 03:34:20

Monomorphism restriction。当您定义一个具有简单模式绑定(只有名称,没有任何函数参数)且没有类型签名的值时,它将获得单态类型。任何类型变量都会尝试根据defaulting rules来消除歧义,如果不成功,就会得到一个类型错误。

在这种情况下,Num约束类型变量默认设置为Integer

您可以使用以下命令关闭单态限制

代码语言:javascript
复制
ghci> :set -XNoMonomorphismRestriction

或在命令行上使用-XnoMonomorphismRestriction标志。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11003535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档