gpt4 book ai didi

haskell - 类的 ghci 意外行为实例

转载 作者:行者123 更新时间:2023-12-01 22:32:36 25 4
gpt4 key购买 nike

我一直在阅读 Bryan O'Sullivan 及其同事的“Real World Haskell”,并在 Windows 下遇到了我称之为 GHCi 7.8.3 版的意外“松懈”。我“:加载”了以下内容-

module JSONModule   where

data JValue = JNumber Double
| JBool Bool
deriving ( Show, Eq, Ord )


class JSON a where
toJValue :: a -> JValue
fromJValue :: JValue -> Either String a


fromJBool (JBool b) = Right b
fromJBool _ = Left "not a JSON boolean"

instance JSON Double where
toJValue = JNumber
fromJValue = doubleToJValue id

instance JSON Bool where
toJValue = JBool
fromJValue = fromJBool

doubleToJValue :: (Double -> a) -> JValue -> Either String a
doubleToJValue f (JNumber v) = Right (f v)
doubleToJValue _ _ = Left "not a JSON number"

然后,在 ghci 中:

*JSONModule> :r
[1 of 1] Compiling JSONModule ( JSONModule.hs, interpreted )
Ok, modules loaded: JSONModule.
*JSONModule> toJValue False
JBool False
*JSONModule> fromJValue it
Left "not a JSON number"

虽然这是事实,但并非人们所期望的那样。我认为 ghci 应该告诉我放风筝,因为有 2 个 fromJValue 实例。事实上,如果我指定

fromJValue it :: Either String Bool

我猜对了,错了。问题似乎是 doubleToJValue。消除 JSON Double 实例,并向 JValue 添加 JChar Char 构造函数,以及相应的 JSON Char 实例,我从 ghci 得到了预期的“不明确”响应。所以我认为有一个错误。评论?谢谢...

最佳答案

这不是错误,而是 ExtendedDefaultRules extension 的结果,默认情况下在 GHCi 提示符下启用,但在文件中不启用。

近似地,当一个类型在其他方面不明确并且具有正确形式的类约束时,具有此扩展的 GHC 将尝试将其默认为适合 ()、Integer、Double 的第一个类型。

如果没有ExtendedDefaultRules扩展,比如默认在模块文件中,默认还是可以发生的,但是要求更严格(至少要涉及一个数字类,并且() 没有尝试过)并且只会应用于一组固定的类,而不是您自己定义的任何类。

关于haskell - 类的 ghci 意外行为实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892910/

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