2

我已经在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 [] _ = error("empty list!")
howManyPrefixes (x:xs) y  = map (\x -> (x,prefixCount x y)) xs
4

2 回答 2

3

您可以只使用 map,当然它仍然是递归的:

howManyPrefixes prefixList wordList = 
    map (\prefix -> (prefix, prefixCount prefix wordList)) prefixList

如果你真的想在不使用的情况下做到这一点,那么你可以像使用其他任何东西一样map重新实现。只是:mapmap

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

因此,您可以将上述内容转换为:

howManyPrefixes [] _ = []
howManyPrefixes (prefix:prefixList) wordList = 
 -- f x                                   : map f xs
    (prefix, prefixCount prefix wordList) : howManyPrefixes prefixList wordList
于 2013-10-15T22:03:23.620 回答
1

递归定义是

howManyPrefixes :: [[a]] -> [a] -> [([a], Int)]
howManyPrefixes [] _     = []
howManyPrefixes (x:xs) y = 
  let count = prefixCount x y 
  in (x, count) : howManyPrefixes xs y
于 2013-10-15T22:21:52.567 回答