我試圖從列表中刪除具有給定謂詞的塊。我希望使用雙字符,例如~/
,但已解決只使用$
。我基本上是想要做的就是這個...從Haskell字符串切割特定塊
A: "Hello, my $name is$ Danny and I $like$ Haskell"
我想要把它變成是這樣的:
B: "Hello, my Danny and I Haskell"
所以我想在給定符號間剝離一切,$
,或者我的第一選擇是~/
,如果我能算出來的話。我試過的是這樣的:
s1 :: String -> String
s1 xs = takeWhile (/= '$') xs
s2 :: String -> String
s2 xs = dropWhile (/= '$') xs
s3 :: String -> String
s3 xs = s3 $ s2 $ s1 xs
這個解決方案似乎只是bug我的IDE(可能無限循環)。
解決方案:
s3 :: String -> String
s3 xs
|'$' `notElem` xs = xs
|otherwise = takeWhile (/= '$') xs ++ (s3 $ s1 xs)
s1 :: String -> String
s1 xs = drop 1 $ dropWhile (/= '$') $ tail $ snd $ break ('$'==) xs
你的例子'A'實際上生成'Hello,.my..Danny.and.I..Haskell'。我使用點而不是空格,因爲不知何故,SO會在註釋中刪除多餘的空白(即使在代碼塊中)。 – ThreeFx
幹得好!請注意'drop 1'只是'tail'。另外,你可以稍微清理一下代碼,但使用模式匹配和'where'子句。正如@ChrisMartin所說,「Parser」也可以使用,特別是對於更復雜的問題。 – ThreeFx