0

我已经在haskell 中编写了2 个函数,现在我必须编写第三个函数,用于计算haskell 中的前缀数量。这是一个例子:

我必须列出。第一个是前缀列表,另一个是文本列表。这个函数的作用是计算前缀列表中每个单词作为文本列表中所有单词的前缀的次数,并将其呈现在一个元组中(单词,作为前缀出现的次数在正文中:

前缀列表 ["go", "co"]

文本列表 ["golf", "company", "count"]

这应该返回 [("go", 1) , ("co", 2)]

我到目前为止是这样的:

isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
isPrefixOf [] _ = True
isPrefixOf _ [] = False
isPrefixOf (x:xs) (y:ys) = x == y  && isPrefixOf xs ys


prefixCount :: (Eq a1, Num a) => [a1] -> [[a1]] -> a
prefixCount _ [] = 0
prefixCount x (y:ys) | isPrefixOf x y = 1 + prefixCount x ys
                 | otherwise = prefixCount x ys



howManyPrefixes _ [] = 0
howManyPrefixes [] _ = 0
howManyPrefixes (x:xs) (y:ys) = (x, prefixCount x (y:ys))

有什么帮助吗?

4

1 回答 1

1

使用zip它很容易

howManyPrefixes ps ws = zip ps $ map (`prefixCount` ws) ps

现在,因为这看起来像家庭作业,我会让你自己编写递归解决方案,一些有用的提示。

  1. 您当前的解决方案即将完成
  2. 不要检查第二个列表(您的计数前缀所在的列表)是否为空。这是您当前解决方案的第二个子句。
  3. 在你的最后一个子句中,通过将该元组添加到结果列表中来添加递归步骤howManyPrefixes xs (y:ys)
  4. 不要在第二个列表上进行模式匹配,例如y:ys. 如果它是空的也没关系。
于 2013-10-14T15:24:03.980 回答