私は適切な専門用語がないことを許してください - 私は変則性などについて何も知らないが、私が表現しようとしている概念がある種の言葉で記述できるという気持ちがある。map、reduce、またはfilterをとり、それらの関数化されたバージョンを返す関数を書くことは可能ですか?
地図、削減し、フィルタ、古典高階関数、すべての機能f
とデータのリストを取りxs
し、すべてのxs
にそのf
で何かをすることの一般的な構造を持っています。さて、それらのそれぞれについて、私は、機能しているバージョン - mapf、reducef、filterfと呼ぶ - を呼ぶことができます。代わりにデータの一部を取りますx
と関数のリストfs
とfs
のデータをx
。具体的には、mapfはf1(x), f2(x), ...
のリストを返し、reducefはf3 (f2 (f1 (x)))
またはf1 (f2 (f3 (x)))
(左右かどうかによって異なる)を返し、filterfはそれぞれf1(x), f2(x), ...
がtrueであったかどうかをテストしてfs
だけを返します。
私の質問は次のとおりです。map、reduce、またはfilterを引数とし、対応するmapf、reducef、またはfilterf関数を生成する汎用関数functionise
を記述することは可能ですか? (もちろん、エレガントな方法では、一連のケース表現ではなく)。
どのようなプログラミング言語が使用されても構いません。私自身の実験では、私はHaskellのを使用して、どのようなこの質問に私を導いたことは、私は機能の3つのすべてが非常に同様の方法で定義することができることに気づいたということでしたされています:私はでtantalisedい
rev = \x y -> y x
mapf :: a -> [a -> b] -> [b]
mapf x fs = map (rev x) fs
reducef :: a -> [a -> a] -> a
reducef x fs = foldl rev x fs
filterf :: a -> [a -> Bool] -> [a -> Bool]
filterf x fs = filter (rev x) fs
私はそれが可能であることを知り、それが不可能であることをどのように、あるいは見せるかを見て、理由を見たいと思います。私が言ったように、プログラミング言語は重要ではないので、言語Aでは可能だが言語BではタイプBシステムではないということは気にしない。興味深いだろう。
ありがとうございました!
同様に、 'filterf vs fs = filter($ v)fs' – rampion