【问题标题】:map of all successors for each element in haskellhaskell 中每个元素的所有后继者的映射
【发布时间】:2015-01-09 02:35:06
【问题描述】:

给定一个元素序列,我想找到每个元素的所有直接后继者的列表:

例子:

"AABAABAAC"

应该返回类似(使用Data.Map):

fromList [('A',"ABABA"), ('B',"AA"), ('C', "")]

我知道fromListWith 函数,但我似乎无法正确理解列表:

succs :: Ord a => [a] -> M.Map a [a]
succs xs = M.fromListWith (++) [(x, ???) | ??? ]

【问题讨论】:

  • 为什么不是ABAABAAC 的继任者AABABA 的继任者 A 在哪里?编辑:好的,我明白,但请编辑你的问题。写“每重复一次”
  • 很抱歉不清楚。我在考虑直接继任者。我认为该序列是一系列状态A,B,C 和两个相邻状态,这意味着从一个状态到另一个状态的转换。序列将是这样的:A->A->B->A->A->B->A->A->C.

标签: haskell list-comprehension


【解决方案1】:

您可以将问题分成两部分。首先,找到列表的两个元素之间的边。

edges :: [a] -> [(a, a)]
edges (x:y:zs) = (x,y):edges (y:zs)
edges _ = []

然后为带有fromListWith 的项目的直接后继项目构建一个映射。

succs :: Ord a => [a] -> M.Map a [a]
succs = M.fromListWith (++) . map (\(x,y) -> (x,[y])) . edges

这并不能完全满足您的需求。 'C' 没有条目,因为它没有直接的继任者。

succs "AABAABAAC" = fromList [('A',"CABABA"),('B',"AA")]

相反,我们可以制作一个不太通用的edges 版本,其中包含列表中最后一项的一项。

succs :: Ord a => [a] -> M.Map a [a]
succs = M.fromListWith (++) . edges
    where
        edges (x:y:zs) = (x,[y]):edges (y:zs)
        edges (x:zs)   = (x,[] ):edges zs
        edges _ = []

【讨论】:

    【解决方案2】:

    这有帮助吗?

    succs xs@(_:xss) = M.fromListWith (++) $ zip xs (map (:[]) xss ++ [[]])
    

    我认为它返回('A',"ABABAC")...,您的示例没有C

    (:[]) 是一个免点版本

    singleton :: a -> [a]
    singleton x = [x]
    

    我是如何得到这个解决方案的?我觉得斐波那契数的这个定义很有趣:[1][2]

    fibs = fibs = 0:1:zipWith (+) fibs (tail fibs)
    

    类似的东西可以将每个元素与其后继元素配对:

    let x = "AABAABAAC"
    zip x (tail x)
    [('A','A'),('A','B'),('B','A'),('A','A'),('A','B'),('B','A'),('A','A'),('A','C')]
    

    这种类型几乎与输入匹配

    M.fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> M.Map k a
    

    现在将字符转换为单例列表并添加一个空列表以不抑制('C',"")

    【讨论】:

    • 它返回('A',"CABABA")...,因为fromListWith 如何应用组合功能。可以通过fliping (++) 反转顺序。也可以通过添加fmap reverse . 来完成。
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多