2016-04-19 30 views
-1

我試圖做這個練習的一本書,列表字符串的單串

定義一個函數:

onSeperateLines :: [String] -> String 

這需要字符串列表,並返回其打印時一個字符串在單獨的行上顯示字符串。

我有一個列表轉換爲一個字符串掙扎

onSeperateLines :: [String] -> String 
onSeperateLines ls = [x | x <- ls] 

我可以寫一個字符串並將其轉換爲一個列表,並輸出一個列表的列表功能,但我可以」弄清楚如何獲取列表並將其轉換爲單個字符串。

回答

3

一個String只不過是字符的列表:

type String = [Char] 

因此,

onSeperateLines :: [[Char]] -> [Char] 

現在,如果你確實需要這對於一些應用,這是一個好主意,先ask Hoogle if there's already something there。你得到一大堆結果:

unlines :: [String] -> String - 這正是正在努力實現的功能!
unwords :: [String] -> String - 類似,但只插入空格,換行不
joinPath :: [FilePath] -> FilePath - 在這裏不相關
concat :: [[a]] -> [a] - 這確實扁平化嵌套列表一個簡單的像一個字符串的總任務。

concat如果您不只是想爲特定任務使用標準功能,而且也不想讓生活變得比必要更難,那麼這是一個不錯的選擇。

當然,也可以自己編寫一個這樣的函數,一次完成完全。要做到這一點,你需要遞歸&dagger;解構列表。這非常簡單,這要歸功於模式匹配:

onSeperateLines [] = ... --- no lines to concatenate... what's the result? 
onSeperateLines (l:ls) = ... 
where otherLines = onSeperateLines ls 

想一想這些差距會發生什麼。


&dagger;foldr同等的解決方案也是一個很好的練習。

+0

如果我輸入[「first」,「second」,「third」]的列表,我還沒有使用(l:ls)符號,我將如何使用'l'來獲取最後兩個字符串因爲'ls'是一個列表,'l'是指列表中的第一個字符串,不是嗎? – W22

+1

另一個很好的:'插入式',它可以很容易地推廣'unwords'和'unlines'。 – dfeuer

+0

@ W22:對。這就是爲什麼你對'ls'進行遞歸調用的原因:在其中一個調用中,任何行都將是'l'! – leftaroundabout

相關問題