[英]Haskell understanding flow
我是haskell的新手,我正在嘗試編寫一個字符串拆分函數
delim = '|'
splitStr::[Char]->[[Char]]->[[Char]]
splitStr list y
| sL > 0 && sL < length(list) = splitStr (drop (sL+1) list) [subList]++y
| otherwise = [subList]++y
where
subList = takeWhile (\x -> x /= delim) list
sL = length(subList)
split s = splitStr s []
但是,上面的代碼總是以相反的順序返回String
Main> split "foo|bar|java|python"
["python","java","bar","foo"]
從y++[subList]
更改為[subList]++y
仍然會得到相同的結果。 我知道可能有更好的方法,但我想知道為什么會發生這種情況。
splitStr (drop (sL+1) list) [subList]++y
這被解析為(splitStr (drop (sL+1) list) [subList])++y
。 你想要的可能是splitStr (drop (sL+1) list) ([subList]++y)
。
除了sepp2k所說的,還有一些關於如何改進代碼的內容:
在您的代碼中,您不需要累加器,因為您可以利用代碼懶惰。 我重寫了你的代碼,就像我一樣:
split :: Char -> String -> [String]
split delim "" = []
split delim s = chunk : split delim rest where
(chunk,_:rest) = break (==delim) s
它是如何工作的? 我將字符串拆分為第一個字符,即等於分隔符。 我返回該部分並將該函數遞歸調用到列表的其余部分。 這非常有效,因為Haskell在需要之前不會評估列表的其余部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.