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

Jog*_*ger 0 haskell typeclass

类类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>
Run Code Online (Sandbox Code Playgroud)

最小的节说,我可以用foldr函数定义一个实例.在我可以编译的所有示例中,foldr函数都有类型a -> a -> a.但是我无法定义折叠函数真正键入a -> b -> b哪些类型ab 不同的东西.

以下代码显示了一个不编译的示例:

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
Run Code Online (Sandbox Code Playgroud)

是否有可能定义一个Foldable实例foldr,其中的类型ab真正不同?

Pet*_*all 5

问题不在于类型不同.你的类型与需要的foldr不一样Foldable.它需要是:

foldr :: (a -> b -> b) -> b -> Tree a -> b
Run Code Online (Sandbox Code Playgroud)

而那些ab类型参数必须保持为参数:这个已经工作了所有的选择ab.您不能将它们约束到其他类型类,并且您不能将其中一个限制为具体Int类型.