gpt4 book ai didi

haskell - 是否可以根据实现的类型类为泛型定义不同的行为?

转载 作者:行者123 更新时间:2023-12-03 14:26:31 24 4
gpt4 key购买 nike

我想问的实际上还有一个额外的层次,但措辞有点尴尬。这是使用 YesNo 的示例来自“Learn You a Haskell”的类型类。

class YesNo a where
yesno :: a -> Bool

instance YesNo Bool where
yesno = id

instance YesNo [a] where
yesno lst = length lst > 0

这里,泛型类型是 [a] .可以更改此代码以便 yesnoFalse 时使用不同的逻辑(例如返回 a )工具 YesNo ?

最佳答案

当您需要类型类根据所包含的元素表现出不同的行为时,典型且通常最好的做法是实际制作一个新类型包装器并在调用站点手动包装列表。

newtype 声明如下所示:

newtype AllOf a = AllOf { unAllOf :: [a] }

newtype AnyOf a = AnyOf { unAnyOf :: [a] }

而且,不出所料,这些实例使用 allany在基础 list 上:
instance YesNo a => YesNo (AllOf a) where
yesno = all yesno . unAllOf


instance YesNo a => YesNo (AnyOf a) where
yesno = any yesno . unAnyOf

然后当你想使用实例时:
*Main> yesno (AllOf [True, True, False, True])
False
*Main> yesno (AnyOf [True, True, False, True])
True

关于haskell - 是否可以根据实现的类型类为泛型定义不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25110243/

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