【问题标题】:Haskell - Mapping a function over a Rose TreeHaskell - 在玫瑰树上映射函数
【发布时间】:2015-04-30 23:48:13
【问题描述】:

如果我将玫瑰树定义为

data RTree = Node a [RTree a]
    deriving(Show, Eq)

我将如何为它定义地图功能? map函数定义为

map_rose_tree :: (a -> b) -> RTree a -> RTree b

【问题讨论】:

    标签: haskell tree


    【解决方案1】:

    最简单的方法是启用DeriveFunctor扩展和derive Functor

    {-# LANGUAGE DeriveFunctor #-}
    
    data RTree a
        = Node a [RTree a]
        deriving (Show, Eq, Functor)
    
    map_rose_tree = fmap
    

    但如果您想自己定义实例,则需要在 RTree 构造函数上进行模式匹配:

    instance Functor RTree where
        fmap f (Node a children) = Node _ _
    

    您必须自己填写两个_。如果你有足够新的 GHC 版本,你可以编译它并得到错误,告诉你漏洞的类型 (_) 以及你可以用来实现它的相关绑定。第一个洞很容易,第二个难度更大,但我向你保证,只有fmapfachildren 可以解决。

    【讨论】:

    • 我不确定如何映射玫瑰树的列表组件。您能否为该组件提供一个正确的方向?
    • @vs9734 你知道children :: [RTree a],你想得到[RTree b]。你有一个函数fmap :: (a -> b) -> RTree a -> RTree bf :: a -> b,所以fmap f :: RTree a -> RTree b。您如何将其应用于列表的每个元素?
    • 我以为我会使用地图功能,但无论我使用什么组合,我都会不断出错。我需要你说得更清楚一些。我对 Haskell 很陌生。
    • @vs9734 你试过什么组合?我说得更直白基本上就是让我给你答案,所以我想看看你首先卡在哪里。如果我知道这一点,那么我可以为您提供更多有用的建议,帮助您在未来避免这些问题,而不仅仅是现在获得解决方案。
    • @vs9734 [RTree a],是一个嵌套结构。外部列表[] 是函子,内部RTree as 也是函子。您想将as 一直映射到内部,2 层深。那么你会怎么做呢?你可以fmap 一个函数覆盖外部列表,对吗?这将使您可以访问内部RTree as。现在如果你映射的那个函数调用fmap呢?
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多