【问题标题】:Different default behaviors between the prompt and loaded files in GHCiGHCi 中提示和加载文件之间的不同默认行为
【发布时间】:2015-09-17 18:28:56
【问题描述】:

所以我的问题是:

1)(这更具体,与我遇到的问题有关)我如何知道数字的默认类型,即 GHCi 中目前使用的 default (T1, ...) 中的 Ts

2) 有没有办法让输入代码和加载代码在 GHCi 中的行为始终相同? (不包括与键入代码在 IO Monad 中运行这一事实相关的差异)例如,我不应该包含某种扩展名(例如,ExtendedDefaultRules),以便文件中的代码完全按照提示运行.

3) 我如何调用 GHC 和 GHCi 以便相同的代码无论是通过 GHC 还是 GHCi 运行都显示相同的行为? (假设我加载一个应用程序的主文件并在 GHCi 中输入 run main

谢谢

【问题讨论】:

  • 查看downloads.haskell.org/~ghc/latest/docs/html/users_guide/… 的结尾以及从那里链接的部分。
  • 我认为在 GHCi 中无法使单态性限制正常工作,因为无法根据解释器尚未看到的内容来推断表达式的类型。因此,您需要使用 NoMonomorphismRestriction 或文件中的任何名称。
  • @dfeuer 我使用的是 7.10.2,因此限制不适用。但很高兴知道这一点。
  • 单态限制当然适用于文件,即使在 7.10.2 中也是如此。
  • @ØrjanJohansen 很高兴知道,但为什么会有这样的差异?为什么文件也没有关闭?从阅读 RWH 书看来,这将被删除?为什么还没有被删除?此处需要澄清。

标签: haskell


【解决方案1】:

关于第 3 点:

可以使代码在ghcghci 中以完全相同的方式运行: 只使用纯函数和安全函数。通过这样做,您知道优化或副作用不会因实现而显示任何不同的行为(如您链接的问题中所示)。

不需要特殊标志。如果你遵循这个建议,那么就没有任何标志可以让你获得你想要的。

关于第2点:

您可以让 ghci 重新编译每个文件并使用解释器版本而不是加载由 ghc 编译的二进制文件,这样您就可以确保代码的行为就像由 ghci 键入而不是由 ghc 编译。使用:reload 命令强制重新编译。


关于类型和默认设置(第 1 点):

GHCi 默认使用扩展默认规则,在here 中进行了描述。

标准默认规则基本上只默认“数字”(即NumFractional 等)。扩展规则能够为 EqOrdShow 等内容设置默认类型。

请注意,使用ExtendedDefaultRules 时隐含的默认声明是:

default ((), Integer, Double)

因此,基本上,任何“免费”EqOrd 约束都默认为 ()

因此您可以简单地指定ExtendedDefaultRulesNoExtendedDefaultRules 来准确指定您想要的默认类型。

这可以通过将编译指示放入源文件{-# LANGUAGE <extension-name> #-} 或在使用ghc 编译时指定-X<extension-name> 或使用GHCi 指令:set -X<extension-name> 来完成。


正如 dfeur 所指出的,ghci 和 ghc 之间有一个根本的区别:ghci 必须能够在插入时完全推断输入文本的类型。因此,显然,您必须安排声明,以便函数不会引用未定义的名称。

此外,类型默认值将应用于每个语句,这意味着,与单态限制一起(参见:What is the monomorphism restriction?https://wiki.haskell.org/Monomorphism_restriction),ghci 可能会推断出比ghc 推断出的单态类型更多的单态类型。代码。

您可能希望在使用 GHCi 时使用 NoMonomorphismRestriction(尽管最新版本的 ghci 默认禁用它)并且可能也在您的文件中。

【讨论】:

  • 啊,是的,我忘记了全球范围的更大问题!
  • 关于您对问题 3) 的回答:从我的另一个问题和main 中的文件中删除跟踪内容,我只得到纯代码,仍然在 GHCi 中加载文件失败,所以即使使用纯代码提示符下的代码与通过:load 命令加载的文件中的代码之间存在差异。
  • 关于您对问题 2) 的回答:我一直使用 :load 加载文件,即使这样,文件中的代码也只有在我在文件中添加 {-# LANGUAGE ExtendedDefaultRules #-} 时才会加载。为什么 GHCi 和 GHC 不以相同的默认配置启动?
  • 关于您对问题 1 的回答):实际上,通过将 {-# LANGUAGE NoMonomorphismRestriction #-} 放入成功加载到 GHCi 中的文件中(如果我只放入 {-# LANGUAGE ExtendedDefaultRules #-},则相同。所以我的问题再次相同: 为什么 GHCi 和 GHC 不以相同的默认配置启动?为什么这个单态限制仍然存在?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多