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

でもフィルターの置き場所がわからない

4

2 に答える 2

7

あなたの関数を map と組み合わせることで、半分の方法で取得できますが、文字列のリストから空の文字列を削除することはできません。フィルターでこれを行うことができるので、合計で

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

(複数)の核心は、単に文字列のリストに対する (単数)sentencesのマッピングであることに注意してください。sentenceフィルターは、空の文字列を削除するためだけに存在します。この要件がなければ、単純にsentences ss = map sentence ss.

これで、文字列のリストを呼び出しsentencesて各要素を変換できます。ただし、によって削除される空の文字列は除きます。filter

foo一般に、に変換barする関数がある場合、 を使用して に変換bazできます。map foo[bar][baz]

filter、 likemapは、述語関数とリストを指定すると、述語が である要素からなるリストを返す高階関数ですTrue。この場合、述語関数(/="")を指定します。これはTrue、空でないすべての文字列を対象としています。

于 2012-04-22T17:52:39.157 に答える
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..",""] 
于 2012-04-22T19:34:54.490 に答える