haskell中的前缀

haskell中的前缀,haskell,Haskell,我已经在haskell中编写了两个函数,现在我必须编写第三个,用于计算haskell中前缀的数量。下面是一个例子: 我得去看看你的名单。第一个是前缀列表,另一个是文本列表。该函数的作用是计算前缀列表中的每个单词作为文本列表中所有单词前缀的次数,并将其显示在元组中(单词,在文本单词中作为前缀出现的次数: 前缀列表[“go”,“co”] 文本列表[“高尔夫”、“公司”、“计数”] 这应该返回[(“go”,1),(“co”,2)] 我有这个: isPrefixOf :: (Eq a) => [a

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

我得去看看你的名单。第一个是前缀列表,另一个是文本列表。该函数的作用是计算前缀列表中的每个单词作为文本列表中所有单词前缀的次数,并将其显示在元组中(单词,在文本单词中作为前缀出现的次数:

前缀列表[“go”,“co”]

文本列表[“高尔夫”、“公司”、“计数”]

这应该返回[(“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

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

howManyPrefixes prefixList wordList = 
    map (\prefix -> (prefix, prefixCount prefix wordList)) prefixList
如果您真的不想使用
map
来实现它,那么您可以像其他任何东西一样重新实现
map
map
只是:

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

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

howManyPrefixes prefixList wordList = 
    map (\prefix -> (prefix, prefixCount prefix wordList)) prefixList
如果您真的不想使用
map
来实现它,那么您可以像其他任何东西一样重新实现
map
map
只是:

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

递归定义将是

howManyPrefixes :: [[a]] -> [a] -> [([a], Int)]
howManyPrefixes [] _     = []
howManyPrefixes (x:xs) y = 
  let count = prefixCount x y 
  in (x, count) : howManyPrefixes xs y

递归定义将是

howManyPrefixes :: [[a]] -> [a] -> [([a], Int)]
howManyPrefixes [] _     = []
howManyPrefixes (x:xs) y = 
  let count = prefixCount x y 
  in (x, count) : howManyPrefixes xs y

您的代码不完整您在映射函数中有名称阴影,这使得很难理解该函数的目标是什么。yan可能是指缺少多少引用的类型签名。这是故意的吗?@J.Abrahamson我现在编辑了它,并解释了它的作用,以便更好地理解您仍然有hadown,但更清楚的是您想要什么。如果您使用
map
,实际上不需要递归,但是:
多少个xsy=map(\x->(x,前缀xy))xs
。请注意,在这个版本中,
x
所指的内容总是很清楚的——它只存在于内部函数中。您的代码是不完整的。映射函数中有名称阴影,这使得很难理解函数的目标是什么。yan可能是指有多少个引用缺少类型签名。这是entational?@J.Abrahamson我现在编辑了它,我解释了它应该做什么,为了更好地理解你仍然有阴影,但是你想要的更清楚。如果你使用
map
,实际上不需要递归,但是:
多少个xsy=map(\x->(x,prefixCount xy))注意,在这个版本中,
x
所指的内容总是很清楚的——它只存在于内部函数中。但是如果我想要一个递归解决方案,那会是什么样子?但是如果我想要一个递归解决方案,那会是什么样子?