繁体   English   中英

映射和过滤可能返回 function 的可能列表

[英]Mapping and filtering a list of maybes with a maybe returning function

我有一个可能的列表和一个 function 给我一个节点的颜色(如果存在):

maybeNeighbors :: [Maybe Node]
nodeColor      :: Node -> Maybe Color

现在我想 map colors 到节点,作为中间步骤,我想要一个元组列表:

coloredList    :: [(Color, [Node])]

(因为我稍后会用listToUFM_C (++) listColored

这是我到目前为止所拥有的,它可以工作但看起来很丑:

listColored    =  mapMaybe (\n -> nodeColor n >>= \c -> Just (c, [n])) $ catMaybes maybeNeighbors

(使用来自 Data.Maybe 的catMaybesmapMaybe

我觉得我错过了一些东西,我应该能够做类似(fmap. fmap) func maybeNeighbors的事情,但我不知道func应该是什么样子。 或者像这样的function,我也找不到:( (Maybe a -> Maybe b) -> [Maybe a] -> [Maybe b]

编辑:

我正在研究一个图形着色问题,我想要一个具有相同颜色的节点列表。 这是一个在 GHCi 中测试的示例:

let l = [Just (1, Just 'a'), Just (2, Just 'a'), Nothing, Just (3, Just 'b'), Just (4, Nothing)]

这似乎可以最简洁地表达为列表理解:

listColored = 
    [ (c, [n])
    | Just n <- maybeNeighbors
    , Just c <- [nodeColor n]
    ]

在列表推导中,模式匹配失败将导致只是跳过元素,因此您自然会摆脱nodeColor中的Nothing以及maybeNeighborsNothing输出。

如果我理解正确,您正在制作 function [Maybe Node] -> Map Color [Node]

colorMap :: [Maybe Node] -> Map Color [Node]
colorMap = Map.fromListWith (++) . listColored

listColored :: [Maybe Node] -> [(Color, [Node])]
listColored = mapMaybe $ \maybeNode -> do
  node <- maybeNode
  color <- nodeColor node
  pure (color, [node])

编辑:隔离listColored部分以便更好地与 Fyodor 的列表理解进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM