使用haskell过滤以“ed”或“ing”结尾的单词

时间:2014-01-09 10:41:58

标签: haskell

嗨,我是Haskell的新手和功能编程..

我想传入字符串并找到以“ed”或“ing”结尾的单词。

eg: if the string is "he is playing and he played well"
answer should be : playing, played

有没有人知道如何使用Haskell做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以使用标准Haskell函数构建它。首先导入Data.List:

import Data.List

使用isSuffixOf确定一个列表是否以另一个列表结尾。 endings下方["ed","ing"]可能是w"played"就是您正在测试的字词,例如hasEnding endings w = any (`isSuffixOf` w) endings

ws

假设您已将字符串拆分为单个字词列表(下面为filter),请使用wordsWithEndings endings ws = filter (hasEnding endings) ws 删除您不想要的字词:

words

使用intercalculate获取原始字符串中的单词列表。使用.将过滤后的单词重新加入到最后一个以逗号分隔的字符串中(如果您希望将结果作为单词列表,请将其关闭)。使用wordsEndingEdOrIng ws = intercalate ", " . wordsWithEndings ["ed","ing"] . words $ ws 将这些功能链接在一起。

wordsEndingEdOrIng "he is playing and he played well"

你已经完成了。

let

如果您输入ghci,请将{{1}}放在每个函数定义的前面(除了最后一行之外的所有行)。

答案 1 :(得分:0)

contain w end = take (length end) (reverse w) == reverse end

findAll ends txt = filter (\w -> any (contain w) ends) (words txt)

main = getLine >>= print . findAll ["ing","ed"]

findAll :: [String] - >字符串 - > [字符串]
findAll ::“endings” - > “你的文字” - > “正确的话”