gpt4 book ai didi

haskell - GHCi 是否不应用默认声明来解决类型歧义?

转载 作者:行者123 更新时间:2023-12-03 22:57:30 27 4
gpt4 key购买 nike

作为 Haskell 的新手,我正在努力解决以下差异(我确信这是有充分理由的)。也许我的问题只是源于对 GHCi 的误解,但当我能消除疑虑时,我晚上会睡得更好。

来了。如果,在将名称 foo 绑定(bind)到脚本中的某个整数表达式(此处为 1)并编译该脚本后,我将后者加载到 GHCi 中,:t 告诉我 foo 的类型是 Integer

$ printf %s\\n "foo=1" > foo.hs
$ ghci
λ> :l foo.hs
[1 of 1] Compiling Main ( foo.hs, interpreted )
Ok, modules loaded: Main.
λ> :t foo
foo :: Integer

据我了解,foo 类型的歧义已解决,这要归功于一些 default declaration ,我认为,在 Prelude 的某处指定:

default (Integer, Double)

到目前为止,还不错。但是,当我直接在 GHCi 中执行看似等效的 let 绑定(bind)时,:t 告诉我后者仍然将 foo 视为多态数字常量,不是 Integer:

$ ghci
λ> let foo=1
λ> :t foo
foo :: Num a => a

如何解释这种差异?其背后的原理是什么? GHCi 是否不适用 default declaration解决类型歧义?如果是,它会在什么情况下发生?

(有关信息,我使用的是 GHC 7.8.3。)

最佳答案

Does ghci not apply the default declaration to resolve type ambiguity?

在 GHC 7.8 或更高版本中 Monomorphism Restriction在 GHCi shell 中确实是关闭的,因此在交互式 shell 中的声明不会将 Num 默认规则应用于不在 lambda 绑定(bind)器下的顶级表达式(根据单态限制)。单态限制仍然适用于加载的外部模块。

您可以使用 :set -XMonomorphismRestriction 切换它。

关于haskell - GHCi 是否不应用默认声明来解决类型歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27079125/

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