首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以用foldr定义Data.Foldable的实例,其中foldr接受不同类型的参数?

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

Stack Overflow用户
提问于 2017-09-19 10:52:49
回答 2查看 129关注 0票数 0

类型类Data.Foldable有以下定义:

代码语言:javascript
复制
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类型的东西,其中ab类型不同。

下面的代码显示了一个没有编译的示例:

代码语言:javascript
复制
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定义一个可折叠的实例,其中ab类型实际上是不同的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-19 10:55:37

问题不在于类型不同。foldr的类型与Foldable所需的不一样。它必须是:

代码语言:javascript
复制
foldr :: (a -> b -> b) -> b -> Tree a -> b

这些ab类型参数必须保持为参数:这必须适用于ab的所有选择。您不能将它们限制为其他类型类,也不能将它们中的一个限制为具体的Int类型。

票数 5
EN

Stack Overflow用户

发布于 2017-09-19 12:02:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46298573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档