我有以下代码:
realWord :: String -> String
realWord s = if elem (map toLower s) ["the","a","of","in","at"] then "" else (map toLower s)
这是为了测试一个像#"教父"包含任意数量的琐碎词,例如""。然而,当我把#"教父"进入函数,显然它给出了这个字符串不包含在列表中,并再次吐出句子。
如何打破句子"教父"到一个单词列表,我可以单独测试,然后再在一个句子中重新组合?
我想要输入的输出"教父"是"教父"。
答案 0 :(得分:9)
realWord = unwords . filter (`notElem` trivial) . words . toLower
where trivial = ["the","a","of","in","at"]
答案 1 :(得分:0)
首先,DRY:
realWord s
| s' `elem` trivial = ""
| otherwise = s'
where trivial = ["the","a","of","in","at"]
s' = map toLower s
因此。问题是,你没有以任何方式解构字符串。你正在尝试做的是匹配某些东西和"消费&扔掉"它被发现时 - 它实际上是解析的一个非常基本的子任务。
对于这个问题,尼克拉斯'解决方案可能是最好的,但为了使它更通用,它很简单,可以使用one of the "big weapons":
import Text.Parsec
extractRealWord :: Parsec String u String
extractRealWord = do
skipMany . choice
. map (\w -> string w >> many (oneOf ",. !?\n"))
$ ["the", "a", "of", "in", "at"]
>>= \w@(f:r) -> [w, toUpper f : r]
many . oneOf $ ['a' .. 'z'] ++ ['A' .. 'Z']
用于例如
Prelude Text.Parsec Data.Char> runP extractRealWord()[]"教父"
对,教父"