在haskell中相对于其邻居的char的出现

时间:2015-04-21 21:59:27

标签: haskell

我有一个类似的字符串

test = "fDfDfadsptupauOasufDfDfadsptupausapasdfogfdifdsudsaufuffxDfDfDfDfDfDfadsptupauOasufDfDfadsptupausap"

我希望得到例如char' 0'的出现次数。关于' 0'之后的字符。 ,例如,当我调用我的函数时,它应该给出

的字符串测试
 ('0',[(8,'w'),(2,'q')])

这意味着char' 0'以#34; 0w"形式发生8次和#34; 2q"

形式的2次

直到现在我仍然对“' 0'这是10,但我无法得到它的邻居,我的代码

freq c l = filter (==c) l
function::[(Char ,Int)]
function = [('0' , sum (map length (map (freq '0') test)))]

请注意我的输出应为

类型
function :: [(Char,[(Int,Char)])

1 个答案:

答案 0 :(得分:4)

考虑如何将数据转换为String,使其成为可以处理的结果,以便为您提供所需的结果。你真正感兴趣的是成对的相邻字符,所以你的第一步是编写一个函数,将每个元素与其后继元素配对:

matchSuccessors :: String -> [(Char, Char)]
matchSuccessors text = undefined

然后,您希望将第一个元素组合在一起,例如'0'。为此,您需要查看sort/sortBy中的group/groupByData.List

organizeSuccessors :: [(Char, Char)] -> [[(Char, Char)]]
organizeSuccessors succs = undefined

此时你应该有类似

的东西
> organizeSuccessors (matchSuccessors "abababacacabac")
[[('a','b'),('a','b'),('a','b'),('a','b')],
 [('a','c'),('a','c'),('a','c')],
 [('b','a'),('b','a'),('b','a'),('b','a')],
 [('c','a'),('c','a')]
]

(为了便于阅读而添加了空格)

现在,您可以非常轻松地测量每个长度,并将其与哪个元素配对:

countSuccessorGroups :: [[(Char, Char)]] -> [((Char, Char), Int)]
countSuccessorGroups grps = map (\grp -> (head grp, length grp)) grps

现在你会看到

> countSuccessorGroups $ organizeSuccessors $ matchSuccessors "abababacacabac"
[(('a', 'b'), 4),
 (('a', 'c'), 3),
 (('b', 'a'), 4),
 (('c', 'a'), 2)
]

现在,凭借您对sortBygroupBy的了解,您应该能够将其转换为您需要的内容:

organizeByFirstLetter :: [((Char, Char), Int)] -> [(Char, [(Int, Char)])]
organizeByFirstLetter succgrps = undefined

所以你的整个计划将是

function
    = organizeByFirstLetter
    $ countSuccessorGroups
    $ organizeSuccessors
    $ matchSuccessors
    $ test

您还可以根据需要将organizeByFirstLetter分解为多个步骤。