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
将具有您想要的行为