gpt4 book ai didi

haskell - 为什么有些运算符在赋值时会改变类型?

转载 作者:行者123 更新时间:2023-12-02 00:16:17 25 4
gpt4 key购买 nike

当我询问 + 运算符的类型时,它正如您所期望的那样

Prelude> :t (+)
(+) :: Num a => a -> a -> a

当我将运算符分配给变量时,类型签名会发生变化

Prelude> let x = (+)
Prelude> :t x
x :: Integer -> Integer -> Integer

为什么运算符赋值时类型会改变?

最佳答案

这就是“可怕的单态限制”。本质上,当你定义一个

  1. 新的顶级名称
  2. 看起来不像函数定义

然后,默认情况下,Haskell 会尝试变得聪明并为其选择一个不完全通用的类型。最初的原因是为了让 Haskell 更容易使用(没有它,编写具有不明确类型的程序可能会更容易),但最近它似乎只是让每个人都陷入困境,因为这是非常意外的行为。

分辨率?

  1. 使用 GHC 7.8。 7.8 版本之后,GHCi session 自动...
  2. 使用 -XNoMonomorphismRestriction 来关闭此行为,或者
  3. 提供类型注释,例如

    let { x :: Num a => a -> a -> a; x = (+) }

在正常的 Haskell 代码中,强烈建议使用方法 (3)。使用GHCi时,(1)和(2)更方便。

关于haskell - 为什么有些运算符在赋值时会改变类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24972584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com