我希望我清楚自己的问题!
任何帮助将不胜感激!
答案 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
fst
和foldr
的文档非常清楚,但如果您之前没有遇到过函数组合,.
的文档会有点简洁。
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
如何调用它,这可能会更容易。