【问题标题】:Counting prefixes in Haskell在 Haskell 中计算前缀
【发布时间】:2013-10-16 00:03:45
【问题描述】:

我已经在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))

有什么帮助吗?

【问题讨论】:

  • 如果您使用Ord 而不仅仅是Eq,您将可以从Data.List 访问sortsortBygroupgroupBy。我会先玩那些。
  • @bheklilr 你不需要这些,Ord 约束在你只检查前缀时是不必要的。
  • @jozefg 你确实需要Ord 来代替sort(我错误地认为group 也需要它),虽然这可以在没有Ord 的情况下解决(作为你的答案点out),但我试图引导 dcarou 找到我看到的使用其中一个或多个函数的潜在解决方案。
  • 我必须使用递归解决方案

标签: haskell


【解决方案1】:

使用zip 这很容易

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

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

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

【讨论】:

  • 是的,这实际上是作业哈哈,很好看,让我告诉你!但我正在努力解决的问题是,我不知道如何让它检查文本中第一个单词的前缀,然后是其他单词。我相信我第一个词就解决了它,但后来我迷路了..我已经做到了 howManyPrefixes [] _ = 0 howManyPrefixes (x:xs) (y:ys) | (x, prefixCount x y) |否则 = howManyPrefixes xs (y:ys)
  • @dcarou 关键是:首先编写一个函数,计算一个单词的前缀。一旦你有了它,在地图中使用它。
  • 所以要计算一个单词的前缀,我有这个:howManyPrefixes (x:xs) (y:ys) = (x, prefixCount x y),添加地图看起来像这样? howManyPrefixes (x:xs) (y:ys) |地图(x,prefixCount x y)?这不是递归的,但我不确定我是否应该在这里使用“否则”守卫
  • 考虑map (\x -> prefixCount x ys) xs的结果。这会是什么?这对你有什么帮助?
  • @Ingo 来自 map 的定义,它会返回一个包含所有元素的列表,但我仍然没有看到递归的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2016-09-04
  • 1970-01-01
相关资源
最近更新 更多