2017-02-19 3 views
1

文字列内のすべての句読記号を数えます。文字がこのグループに属するかどうかを確認するにはどうすればいいですか?、!?;: "。私はこのようにしていますキャラクターがHaskellのシンボルグループに属しているかどうかを確認するにはどうすればいいですか?

signs' curSgn ('.':list) = (signs' (curSgn + 1) list) 
signs' curSgn (',':list) = (signs' (curSgn + 1) list) 
signs' curSgn ('?':list) = (signs' (curSgn + 1) list) 
signs' curSgn ('!':list) = (signs' (curSgn + 1) list) 
signs' curSgn (':':list) = (signs' (curSgn + 1) list) 
signs' curSgn (';':list) = (signs' (curSgn + 1) list) 

しかし、1行のコードでそれを行う方法はありますか?

+0

'punc :: String - > Int'は、例えば' punc = length 'として実装されています。 – jakubdaniel

+0

@ jd823592あなたは受け入れられupvotedされ、他の人がより簡単に答えを見つけるのを助けるためにあなたのコメントを回答として投稿するべきです。 –

答えて

5

filterでシンボルを抽出し、lengthを使用して出現回数をカウントできます。 Filterは値のリストを取り、いくつかのプロパティ(例えば句読点)を満たす値を含む最大のサブリストを返します。

punctuation :: String -> Int 
punctuation s = length (filter (...) s) 

...とは何ですか?文字が句読点であるかどうか、つまりタイプがChar -> Boolの述語であるかどうかを判断する必要があります。文字が指定されたリストにあるかどうかを確認するには?

isPunctuation :: Char -> Bool 
isPunctuation c = c `elem` ['.', ',', '?', '!', ':', ';'] 

一緒文字['.', ...]のリストは、文字列が実際にあることを

punctuation :: String -> Int 
punctuation = length . filter (`elem` ".,?!:;") 

通知をこれらを入れて、あなたは短期で".,?!:;"としてそれを書くことができます。また、唯一の引数sに対して何を行うかという点でpunctuationを定義するのではなく、ポイントフリーの表​​記に気づくと、関数punctuationは関数lengthfilter ...の構成と等しいと言います。また、最初の引数ではなく、elemの2番目の引数をバインドするためのsectionという表記にも注意してください。 isPunctuationもあります。

+0

@ダニエルワグナー:編集、愚かなタイプミスのおかげで。 – jakubdaniel

関連する問題