请注意,这与使用单词function不同.
我想转换成这个:
"The quick brown fox jumped over the lazy dogs."
Run Code Online (Sandbox Code Playgroud)
进入这个:
["The"," quick"," brown"," fox"," jumped"," over"," the"," lazy"," dogs."]
Run Code Online (Sandbox Code Playgroud)
请注意每个单词后第一个空格处的断点.
我能想到的最好的是:
parts "" = []
parts s = if null a then (c ++ e):parts f else a:parts b
where
(a, b) = break isSpace s
(c, d) = span isSpace s
(e, f) = break isSpace d
Run Code Online (Sandbox Code Playgroud)
它看起来有点不雅观.谁能想到更好的表达方式呢?
编辑 - 抱歉,我没有读过这个问题.希望这个新答案符合您的要求.
> List.groupBy (\x y -> y /= ' ') "The quick brown fox jumped over the lazy dogs."
["The"," quick"," brown"," fox"," jumped"," over"," the"," lazy"," dogs."]
Run Code Online (Sandbox Code Playgroud)
库函数groupBy采用谓词函数,该函数告诉您是否将下一个元素y添加到以x开头的上一个列表,或者启动新列表.
在这种情况下,我们不关心当前列表的开头,我们只想在下一个元素y是空格时启动一个新列表(即使谓词求值为false).
nm指出多个空格的处理不正确.在这种情况下,您可以切换到Data.List.HT,它具有您想要的语义.
> import Data.List.HT as HT
> HT.groupBy (\x y -> y /= ' ' || x == ' ') "a b c d"
["a"," b"," c"," d"]
Run Code Online (Sandbox Code Playgroud)
使这项工作的不同语义是x是上一个列表中的最后一个元素(您可以添加y或创建新列表).