一覧

2016-04-19 8 views
-1

私は本の中でこの演習をやろうとしている、一覧

関数定義:

onSeperateLines :: [String] -> String 

文字列のリストを受け取り、印刷された単一の文字列を返します。別々の行に文字列を表示します。 「私は、単一の文字列にリストを変換するに苦しんだ

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

私は文字列を取り、リストと、リストを出力リストに変換する関数を書くことができますが、私はすることができますリストを取って単一の文字列に変換する方法を理解する。あなたが実際にいくつかのアプリケーションのためにこれを必要とする場合したがって

type String = [Char] 

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

は今、それは最初ask Hoogle if there's already something thereすることをお勧めします:

答えて

3

Stringは、文字のリスト以外の何ものでもありません。あなたは結果の全体の多くを得る:

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 

これらの隙間に何が入るか少し考えてみましょう。


;foldrと同等の解決策も良い運動です。

+0

私は["first"、 "second"、 "third"]のリストを入力した場合、前の(l:ls)表記を使用しませんでした。 'ls'はリストであり、 'l'はリストの最初の文字列を参照するためではありませんか? – W22

+1

別の良いもの: 'intercalate'は、' unwords'と 'unlines'を簡単に一般化します。 – dfeuer

+0

@ W22:右。だからこそ 'ls'を再帰的に呼び出すのです:これらの呼び出しの中で、どの行も一度' l'になります! – leftaroundabout