持っ倍プロパティは、それはあなたがそれを右のパラメータを与えて、他のすべてのリスト再帰関数に相当し、リスト、再帰関数であるということです。
それがパラメータとして受け入れるので、それは、リスト内の項目に適用される機能を、このプロパティを持っています。
我々は、単純なSUM関数を書いた場合たとえば、:
sum [] = 0
sum (head:tail) = head + (sum tail)
を、我々は実際に我々が結合するために使用する(+)演算子を渡すことによって、代わりに折り機能としてそれを書くことができますアイテム:
sum list = foldl (+) 0 list
したがって、リストに対して単純かつ再帰的に動作する関数は、折り返し関数として書き換えられます。その等価性は、それが保持する特性です。私はすべてこれらの線形リスト再帰アルゴリズムを例外なく処理するので、彼はプロパティをユニバーサルと呼んでいると信じています。
このプロパティが非常に便利な理由は、これらの他のすべてのアルゴリズムが折り畳みと同じであることを示すことができるからです。折り畳みに関する何かを証明することによって、他のすべてのアルゴリズムに対しても証明されます。
私は個人的にはそう時々私はこのようになりますどの私自身を使用し、理解しにくい折り畳み機能が見つかりました:
-- forall - A kind of for next loop
-- list is list of things to loop through
-- f is function to perform on each thing
-- c is the function which combines the results of f
-- e is the thing to combine to when the end of the list is reached
forall :: [a] -> (a->b) -> (b->b->b) -> b -> b
forall [] f c e = e
forall (x:xs) f c e = c (f x) (forall xs f c e)
それは適用の余分な機能を持っているので(これは実際にはもう少し強力なfoldlのより関数fをリストの各項目に追加します)。
私の機能については誰も何も証明していません。しかし、それは私が私の機能は、実際には倍の関数であることを示すことができるので、重要ではありません。したがって、およそ倍に証明されているすべてのものが、また私のFORALLの機能のために真の証明されている
forall l f c e = foldl c e (map fn l)
そして、そして私のプログラム全体でそのすべての使用。 (forallとfoldlのそれぞれの呼び出しのそれぞれで、どんな種類の関数cが提供されているかを考慮する必要はありません、それは問題ではありません)
私が尋ねてから4年後、今夜はこれについて話している記事に出会った。私はそれが完全に私の質問に答えるかわからないが、それは間違いなく関連している。 「普遍的な財産」のためにこのURLを検索してください:http://jeremykun.com/2013/04/16/categories-whats-the-point/ –
4年前、私は普遍的な財産がどれほどのものか分かりませんでした。今、私は一連のブログ記事を書いています。普遍的な財産に関するより詳細な記事を書いているうちに、私はこれを横断して何があったのでしょう。来週に行うべきです。 – JeremyKun
@Bean、それを聞いてうれしい!私はそれを読むことを楽しみにしています。なぜなら、私は眠りにつくようになっていますが、普遍的な財産が何であるかを深く理解できるからです。 –