代码之家  ›  专栏  ›  技术社区  ›  Jogger

可以定义数据的实例吗。可与foldr折叠,其中foldr接受不同类型的参数?

  •  0
  • Jogger  · 技术社区  · 8 年前

    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函数都具有类型 a -> a -> a 函数具有True类型 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 ,其中类型 真的不同吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Peter Hall    8 年前

    问题不是类型不同。您的 foldr 只是和什么不一样 Foldable

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

    a b 总之 选择 . 不能将它们约束到其他类型类,也不能将其中一个限制为具体类型 Int 类型

        2
  •  1
  •   Robert Hensing Nguyen Hoang Hiep    8 年前

    似乎你想要的东西可以通过使用实际的 foldr 福尔德 addSize 福尔德 . foldr addSize 0 会有你想要的行为。

    推荐文章