10

与えられた述語を満たすリスト内の要素の数を計算する関数を定義したいと思います。

  number_of_elements :: (a -> Bool) -> [a] -> Int
  number_of_elements f xs = length (filter f xs)

例えば:

  number_of_elements (==2) [2,1,54,1,2]

2を返す必要があります。

短く書くことができます:

  number_of_elements f = length . filter f

fパラメータなしで書くことは可能ですか?

4

3 に答える 3

17

もちろんそうだ:

number_of_elements = (length .) . filter
于 2011-12-23T22:07:02.193 に答える
12

私はあなたがあなたが提案したものより読みやすくなることができるとは思わない。ただし、楽しみのために、これを行うことができます。

numberOfElements = (.) (.) (.) length filter

また

(.:) = (.) . (.)
numberOfElements = length .: filter
于 2011-12-23T22:43:25.237 に答える
7

SemanticEditorCombinatorsについて読みたいと思うかもしれません。resultそこからコンビネータを取り出します。

result :: (output -> output') -> (input -> output) -> (input -> output')
result = (.)

コンビネータは関数を受け取り、それresultを別の関数の結果に適用します。ここで、私たちが持っている関数を見てみましょう。

filter :: (a -> Bool) -> [a] -> [a]
length :: [a] -> Int

今、にlength適用され[a]ます。これは、フォームの関数の結果タイプですfoo :: [a] -> [a]。それで、

result length :: ([a] -> [a]) -> ([a] -> Int)

しかし、の結果filterは正確に関数であるため、次の結果[a] -> [a]に適用したいと思います。result lengthfilter

number_of_elements = result (result length) filter
于 2011-12-23T23:42:38.610 に答える