2

関数のリストを受け取り、リストされた各関数に単一の引数を適用し、別の関数を介してリストを圧縮するポイントフリー関数を作成したいと考えています。この関数の無意味なバージョンには、次の型シグネチャがあります。

multiplex :: ([a] -> b) -> [(c -> a)] -> (c -> b)

そして使用例:

invariantsHold :: (Integral a) => a -> Bool
invariantsHold = multiplex (all id) [(>=0),(<=50),even]

以下のように書くことができました。

multiplex :: ([a] -> b) -> [(c -> a)] -> c -> b
multiplex f xs e = f $ map ((flip ($)) e) xs

この実装はポイントフリーではありません。この関数をポイントフリー表現に変換するにはどうすればよいですか?

4

1 に答える 1

3

Applicative無意味なスタイルではありませんが、 ( import が必要) を使用することで大幅に簡素化できますControl.Applicative:

multiplex f xs e = f $ xs <*> pure e

invariantsHold少し単純化することもできます:

invariantsHold = multiplex and [(>=0),(<=50),even]

sequenceA(from )を使用Data.Traversableすることは、これを定義する別の方法multiplexです。

multiplex f xs e = f $ sequenceA xs e

そして、この定義はポイントフリースタイルで書き直すことができます ( で与えますpointfree):

multiplex = (. sequenceA) . (.)

また

multiplex = flip ((.) . (.)) sequenceA

美しいですが、私には無意味に思えます:-)

于 2014-04-19T18:32:48.333 に答える