gpt4 book ai didi

Haskell 无法创建 TypeClass 的实例

转载 作者:行者123 更新时间:2023-12-01 09:34:05 25 4
gpt4 key购买 nike

我是 Haskell 的新手,正在尝试使用实例创建一个类。

我有以下代码,我想说的是:1)分支可以在其第一个位置保存任何类型,2)创建一个线性类,它接受线性事物并返回一个数字3) 如果 Branch 拥有的第一件事是 Num 类的一部分,则将 Branch 设为 Linear 的实例。

data Branch a = Branch a Integer deriving (Show, Eq)

class Linear l where
length :: (Num a) => l -> a

instance (Num a) => Linear (Branch a) where
length (Branch len _) = len

我得到错误:无法推断 (a ~ a1)来自实例声明绑定(bind)的上下文(Num a).....

有人知道如何用 Haskell 表达我想说的话吗?

最佳答案

您的类定义表明 length 必须能够返回用户请求的任何 Num 类型。所以如果用户想要一个 Integer,length 方法必须给他一个 Integer。如果他想要一个 Int 或 Double,长度也必须给他。

但是,您在实例声明中提供的长度函数不符合要求。例如,当您在 Branch Integer 上调用 length 时,length 将返回一个 Integer。即使用户要求,它也不会返回 IntDouble

使您的代码工作的一种方法是使用多参数类型类来定义具有两个参数的线性,其中第二种类型是 length 应该返回的数字类型。然后,您可以拥有 Linear (Branch a) a 的实例。您可能还想使用 Functional Dependencies 扩展使其更有用。除了第二个类型参数,您还可以使用 Type Families 扩展来实现类似的效果。

另一种方法是将实例声明更改为要求 Integral a 而不是 Num a 然后使用 fromIntegral len 作为返回值.这会将存储在分支中的整数类型转换为用户请求的任何数字类型。当然,需要注意的是,您使用非整数数值进行分支,不会以这种方式成为 Linear 的实例。

关于Haskell 无法创建 TypeClass 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553431/

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