解析字符串中的单词

时间:2012-07-13 22:24:17

标签: list haskell

我希望我清楚自己的问题!

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

words中的Prelude函数会为您过滤掉空格(按所需类型查找函数的好方法是Hoogle)。

Prelude> :t words
words :: String -> [String]

您只需要使用适当的过滤器(使用Set)进行组合。这是一个非常基本的:

import Data.Set (Set, fromList, notMember)

parser :: String -> [String]
parser = words . filter (`notMember` delims)
   where delims = fromList ".,!?"

parser "yeah. what?"将返回["yeah", "what"]

查看Learn You A Haskell了解一些优秀的介绍材料。

答案 1 :(得分:1)

您想要Data.List.Split,它涵盖绝大多数拆分用例。

对于您的示例,只需使用:

splitOneOf ".,!?"

如果你想摆脱连续分隔符之间的“空话”,只需使用:

filter (not . null) . splitOneOf ".,!?"

如果您希望这些分隔符来自已存储它们的set,那么只需使用:

import qualified Data.Set as S

s :: S.Set Char

split = filter (not . null) . splitOneOf (S.toList s)

答案 2 :(得分:0)

在您学习的过程中,以下是如何从头开始学习。

import qualified Data.Set as S

首先,一组字边界:

wordBoundaries :: S.Set Char
wordBoundaries = S.fromList " ."

Data.Set.fromList采用元素列表; [Char]String相同,这就是我们可以在这种情况下传递字符串的原因。)

接下来,将字符串拆分为单词:

toWords :: String -> [String]
toWords = fst . foldr cons ([], True)
  where

fstfoldr的文档非常清楚,但如果您之前没有遇到过函数组合,.的文档会有点简洁。

toWords的参数被输入foldr cons ([], True).然后从foldr cons ([], True)获取结果并将其提供给fst。最后,fst的结果用作toWords本身的结果。

我们还要定义cons

    cons :: Char -> ([String], Bool) -> ([String], Bool)
    cons ch (words, startNew)
        | S.member ch wordBoundaries = (              words, True)
        | startNew                   = ([ch]        : words, False)
    cons ch (word : words, _)        = ((ch : word) : words, False)

家庭作业:弄清楚cons的作用及其运作方式。如果您首先要了解foldr如何调用它,这可能会更容易。

相关问题