2012-04-22 14 views
1

私はhaskellを学んでいるが、問題がある。 タイプでなければなりません:sentences :: [String] -> [String]ハスケル:文章を文章に変換する

私はこのように見えるように文

["something","","Asd dsa abc","hello world..",""] 

に文字列を変換したい:["Something.","Asd dsa abc.","Hello world..."]

そして、私はマップのような高次の機能を使用します。 私はちょうどこれを作る方法を理解できません。

私は単一の文字列で動作するように管理さ:

import Data.Char 
sentences :: String -> String 
sentences [] = [] 
sentences (a:as) = ((toUpper a):as) ++ "." 

だから私はこのことから得る:

sentences "sas das asd" 

この:"Sas das asd."

私は誰かがこの問題で私を助けることができると思います。 ご協力いただきありがとうございます!

編集:あなたの助けのおかげで、今、それは次のようになります。

import Data.Char 
sentences :: [String] -> [String] 
sentence (a:as) = ((toUpper a):as)++['.'] 
sentences = map sentence 

しかし、私はマップと結合されたフィルタを配置する

答えて

7

あなたの関数は道のあなたの半分を取得しますが、それどこ知りません空の文字列を文字列のリストから削除しません。あなたはsentences(複数)のコアは、文字列のリストの上にsentence(単数)のマッピングが単純であること、総

sentences ss = map sentence $ filter (/="") ss 

注ので、フィルタでこれを行うことができます。フィルタは、空の文字列を削除するためのものです。この要件がなければ、単純にsentences ss = map sentence ssになります。

今、あなたはあなたがbazbarを変換機能fooを持っている場合は、次のことができ、一般的にfilter

によって除去され、空の文字列を除いて、各要素は変換持つように文字列のリストでsentencesを呼び出すことができますmapように、[baz]

filter[bar]を変換するmap fooを使用し、述語関数とリストを与え、より高次の関数である元素からなるリストを返すため述語はTrueです。この場合、述語関数(/="")は空でないすべての文字列に対してTrueです。

+0

でそれを行うことができ、私はあなたの助けに感謝は、あなたが私にもう少しを助けることができる、私の質問に編集しましたか?どこにフィルターを入れる必要がありますか? – Zomil

+0

新しいコードに合わせて例を編集しました。 – Sarah

+0

もう一度ありがとうございます:) – Zomil

0

ます。また、リスト内包

import Data.Char 

capFirst (l:ls) = toUpper l : ls ++ "." 

sentences strings = [ 
        capFirst sentence | sentence <- strings, 
        sentence /= [] 
        ] 

main = print $ sentences ["something","","Asd dsa abc","hello world..",""]