gpt4 book ai didi

Haskell:在类型类中定义变量

转载 作者:行者123 更新时间:2023-12-05 08:48:46 25 4
gpt4 key购买 nike

我是 Haskell 的新手,在玩类时偶然发现了这个问题。所以基本上我不想在类中定义函数,而是想定义变量。在我的例子中,我在类 Maxable 中定义了一个变量 maxvalue。这与 Int 一起工作得很好。现在假设类型 aMaxable 的实例,我想定义 instance Maxable (Maybe a),你可以在第三个中看到我的代码块不起作用。

class Maxable a where
maxvalue :: a

-- This works fine
instance Maxable Int where
maxvalue = 2147483647

-- Error: Could not deduce (Maxable a1) arising from a use of ‘maxvalue’
instance Maxable a => Maxable (Maybe a) where
maxvalue = maxvalue :: a

我应该用什么替换 maxvalue = maxvalue::a 以便 "(Maybe a).maxvalue == a.maxvalue"

最佳答案

您实际上非常接近正确答案!

首先,要真正解决问题,您需要认识到在Maybe aMaxable 实例中,maxvalue 的类型需要属于 Maybe a 类型。但是,在您的定义中,您将其设为 a 类型。那么,如何将 a 类型的值转换为 Maybe a 类型的值呢?您使用 Just 构造函数。简而言之,你可以这样写:

instance Maxable a => Maxable (Maybe a) where
maxvalue = Just maxvalue

事实证明,GHC 足够聪明,可以使用正确的 maxvalue,您甚至不需要使用 ::a 注释。


但是,你得到的那个错误怎么办?为什么它会告诉您有关 Maxable a1 的信息? GHC 指出的问题来自于您在定义中使用了显式类型签名 maxvalue::a。默认情况下,GHC 不限定类型变量的范围,因此 GHC 不知道您想在实例头中使用相同的 a 。 GHC 假设您只是想要一个新的类型变量,在内部,它决定调用 a1。然后,它对你感到困惑,因为虽然它知道 aMaxable(因为你在实例上下文中这么说),但它不知道 a1Maxable

为了在这种情况下获得更好的错误消息,您可以通过添加

启用 GHC 扩展 ScopedTypeVariables
{-# LANGUAGE ScopedTypeVariables #-}

到文件的顶部。如果您使用此语言扩展运行当前代码,您将得到一个不同的错误,GHC 会提示 a 不等于 Maybe a。如上所述,这可以通过使用 Just 构造函数来解决。

关于Haskell:在类型类中定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65535494/

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