如何将一个句子(String)分解成一个列表([String])?

时间:2014-03-31 23:15:00

标签: haskell

我有以下代码:

    realWord :: String -> String
    realWord s = if elem (map toLower s) ["the","a","of","in","at"] then "" else (map toLower s)

这是为了测试一个像#"教父"包含任意数量的琐碎词,例如""。然而,当我把#"教父"进入函数,显然它给出了这个字符串不包含在列表中,并再次吐出句子。

如何打破句子"教父"到一个单词列表,我可以单独测试,然后再在一个句子中重新组合?

我想要输入的输出"教父"是"教父"。

2 个答案:

答案 0 :(得分:9)

您可以使用前奏函数wordsunwords

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()[]"教父"
  对,教父"