我做了这个函数,它的工作方式与 Haskell 中的words
相同,
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
(before, after) = break isSpace str
我现在正在尝试概括它,以便如果我输入:
gWords' "abcbdecefab" "ac" == ["b","bde","ef","b"]
或
gWords' "abc(hjd(hj))jk)k" "()" == ["abc","hjd","hj","jk","k"]
惯用的Haskell是提供一个谓词(即布尔函数)作为参数:
wordsBy _ [] = []
wordsBy isbrk str = before : wordsBy isbrk (dropWhile isbrk after) where
(before, after) = break isbrk str
然后,您可以提供特定的谓词:
gwords' str brks = wordsBy (`elem` brks) str
解释上面的谓词:
如果函数的第一个参数可以在作为其第二个参数提供的列表中找到,则该函数
elem
返回 true:elem e brks
Haskell有一个替代的中缀格式,将函数视为运算符:
e `elem` brks === elem e brks
Haskell还有一个"slice"符号来部分应用运算符;你可以把它看作是常用lambda形式的简写:
(`elem` brks) === ( e -> e `elem` brks)
这为您提供了所需的谓词:一个为字符串中的字符返回 true 的谓词brks
.