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

Haskell 是否可以根据实现的类型类为泛型类型定义不同的行为?,haskell,Haskell,实际上,我想问的问题有一个额外的层面,但措辞有点尴尬。下面是一个使用“Learning You a Haskell”中的YesNotypeclass的示例 这里,泛型类型是[a]。当a实现yesno时,是否可以更改此代码以使yesno使用不同的逻辑(例如返回False),当您需要类型类根据所包含的元素表现出不同的行为时,需要做的事情是实际创建一个新类型包装器,并在调用站点手动包装列表 新类型声明如下所示: newtype AllOf a = AllOf { unAllOf :: [a] } n

实际上,我想问的问题有一个额外的层面,但措辞有点尴尬。下面是一个使用“Learning You a Haskell”中的
YesNo
typeclass的示例


这里,泛型类型是
[a]
。当
a
实现
yesno
时,是否可以更改此代码以使
yesno
使用不同的逻辑(例如返回
False
),当您需要类型类根据所包含的元素表现出不同的行为时,需要做的事情是实际创建一个新类型包装器,并在调用站点手动包装列表

新类型声明如下所示:

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

newtype AnyOf a = AnyOf { unAnyOf :: [a] }
而且,毫不奇怪,这些实例在基础列表中使用
all
any

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

所以,你的意思是将
实例YesNo a=>YesNo[a]
a
不是
实例YesNo
的情况分开?我几乎肯定这是不可能的,因为当它进行重复实例检查时不会检查约束,但我想看看是否有人有更好的方法来解释它。
*Main> yesno (AllOf [True, True, False, True])
False
*Main> yesno (AnyOf [True, True, False, True])
True