gpt4 book ai didi

带有列表的 Haskell 泛型类型类

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

我有一个这样定义的类,因此 foo 采用泛型类型并返回一个整数:

class Foo a where
foo :: a -> Integer

并定义了几个实例,因此它可以与 BoolChar 类型一起使用:

instance Foo Bool where
foo _ = 10

instance Foo Char where
foo _ = 20

如果我现在想为具有泛型类型的列表添加一个实例,我想做这样的事情:

instance Foo [a] where
foo (t:ts) = (foo t) + (foo ts)

但是,这是错误的。根据我目前的理解,我想假设 Haskell 推断类型并执行以下操作:

foo [False,True] -> foo False + foo True -> 10 + 10 = 20

我看过几本关于多态性和类型类的书籍,包括 Learn You a Haskell For Great Good!但还是不知道如何解决这个问题?

最佳答案

你需要说列表必须包含 Foo 值:

instance Foo a => Foo [a] where
foo (h:t) = foo h + foo t
foo [] = 0

hFoo 实例时只能调用 foo h,因此需要限定类型类为 [ a] 使其仅适用于 Foo 实例的列表。

否则,例如,如果您有一个 [Int],则 foo h 将暗示您将尝试调用 fooInt 值上,但没有为该类型定义 foo

通过 [a] 的上述实现,您将获得预期的结果:

Prelude> foo [True,False,True]
30
Prelude> foo [True,False,True,True]
40
Prelude> foo "foo"
60

关于带有列表的 Haskell 泛型类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442058/

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