【发布时间】:2017-09-19 20:02:58
【问题描述】:
类型类Data.Foldable有如下定义:
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 函数来定义一个实例。
在我可以编译的所有示例中,foldr 函数的类型为a -> a -> a。但是我无法
定义 foldr 函数真正类型为 a -> b -> b 的内容,其中类型为 a 和 b
不一样。
以下代码显示了一个无法编译的示例:
import Data.Foldable
data Tree a = Tree a a | Leaf a
class Size a where
size :: a -> Int
instance Size a => Foldable (Tree a) where
foldr :: a -> Int -> Int
foldr x n = size x + n
是否可以使用foldr 定义Foldable 的实例,其中a 和b 的类型真的不同?
【问题讨论】: