Haskell 是否可以定义Data.Foldable with foldr的实例,其中foldr接受不同类型的参数?

Haskell 是否可以定义Data.Foldable with foldr的实例,其中foldr接受不同类型的参数?,haskell,typeclass,Haskell,Typeclass,类型类具有以下定义: class Foldable t where {-# MINIMAL foldMap | foldr #-} foldMap :: Monoid m => (a -> m) -> t a -> m foldr :: (a -> b -> b) -> b -> t a -> b .... <more definitions> 是否可以使用foldr定义可折叠的实例,其中

类型类具有以下定义:

class Foldable t where
    {-# MINIMAL foldMap | foldr #-}
    foldMap :: Monoid m => (a -> m) -> t a -> m
    foldr :: (a -> b -> b) -> b -> t a -> b
    ....
    <more definitions>

是否可以使用
foldr
定义可折叠的实例,其中
a
b
的类型确实不同?

问题不在于类型不同。您的
foldr
的类型与
Foldable
的要求不同。这需要:

foldr :: (a -> b -> b) -> b -> Tree a -> b

那些
a
b
类型参数必须保留为参数:这必须适用于
a
b
的所有选择。不能将它们约束到其他类型类,也不能将其中一个限制为具体的
Int
类型。

问题不在于类型不同。您的
foldr
的类型与
Foldable
的要求不同。这需要:

foldr :: (a -> b -> b) -> b -> Tree a -> b

那些
a
b
类型参数必须保留为参数:这必须适用于
a
b
的所有选择。不能将它们约束到其他类型类,也不能将其中一个限制为具体的
Int
类型。

似乎可以通过使用实际的
foldr
函数而不是修改它来实现。您不能更改类型类方法的签名,在这种情况下,不需要更改。尝试通过提供其类型的合理实现来实现
foldr
,然后编写一个函数
addSize
,该函数可以作为第一个参数传递给
foldr
foldr addSize 0
将具有您想要的行为。

似乎可以通过使用实际的
foldr
函数而不是修改它来实现您想要的。您不能更改类型类方法的签名,在这种情况下,不需要更改。尝试通过提供其类型的合理实现来实现
foldr
,然后编写一个函数
addSize
,该函数可以作为第一个参数传递给
foldr
foldr addSize 0
将具有您想要的行为