簡體   English   中英

Haskell了解流程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM