(関数型プログラミングでは)「ポイント自由」スタイルとは何ですか?
-
09-09-2019 - |
質問
私は最近気づいたフレーズはのコンセプトである「ポイントを自由」スタイル...
は、まず、そこにこのの質問はだった、と< href = "https://stackoverflow.com/questions/907306/confusion-about-currying-and-point-free-style-in-haskell">も、この1 のます。
そこで、私は彼らが「されて議論する価値があるかもしれないもう一つの話題に言及し、ここでのrel="noreferrer"> href="http://lambda-the-ultimate.org/node/3331"
「ポイント自由」スタイルは何ですか?誰かが簡潔な説明を与えることはできますか?それは「自動」カリー化とは何かを持っていますか? 私のレベルのアイデアを得るために - 私は、スキーム自分自身を教えてきた、とシンプルなSchemeインタプリタを書かれている...私は「暗黙の」カリー化とは何かを理解し、私は任意のHaskellのか、MLを知りません<。 / P>
解決
ちょうどあなたの定義を取得するためにWikipediaの記事のrel="noreferrer">
暗黙プログラミング(ポイントフリープログラミング)は、関数定義はコンビネータと機能組成物を用いて、その引数に関する情報が含まれないようなプログラミングパラダイムである[...]の代わりに変数。 Haskellの例: 従来の(明示的に引数を指定): ポイントフリー( あるいはさらに簡単:代わり そうです:それはカリー化(または関数合成のような操作)と密接に関連するのです。
sum (x:xs) = x + (sum xs)
sum [] = 0
sum
は、明示的な引数を持っていない - それは、0から始まる+
とちょうど倍です): sum = foldr (+) 0
g(x) = f(x)
の、あなただけのg = f
を書くことができます。
他のヒント
ポイントフリースタイルは、関数が関数合成によって定義されていることを、定義されている関数の引数を明示的に言及されていないことを意味します。
は、
のような二つの機能を持っている場合square :: a -> a
square x = x*x
inc :: a -> a
inc x = x+1
あなたはx*x+1
を算出し、1にこの2つの機能を結合したい場合、あなたはこのように「ポイント・フル」それを定義することができます:
f :: a -> a
f x = inc (square x)
ポイント・無料の代替は、引数x
について話をしないで次のようになります。
f :: a -> a
f = inc . square
JavaScriptのサンプルます:
//not pointfree cause we receive args
var initials = function(name) {
return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};
const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();
//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));
initials("hunter stockton thompson");
// 'H. S. T'
ポイント自由なスタイルは、コードが明示的にそれは彼らが存在し、使用されているにもかかわらず、引数をだ言及していないことを意味します。
これは、機能の働き方のHaskellで働きます。
たとえばます:
myTake = take
は一つの引数を取る関数を返します、したがって、引数はあなたがあまりにも場合を除き、明示的な型に理由はありません。
ここでは他のライブラリなしで活字体で一例です。
interface Transaction {
amount: number;
}
class Test {
public getPositiveNumbers(transactions: Transaction[]) {
return transactions.filter(this.isPositive);
//return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
}
public getBigNumbers(transactions: Transaction[]) {
// point-free
return transactions.filter(this.moreThan(10));
// not point-free
// return transactions.filter((transaction: any) => transaction.amount > 10);
}
private isPositive(transaction: Transaction) {
return transactions.amount > 0;
}
private moreThan(amount: number) {
return (transaction: Transaction) => {
return transactions.amount > amount;
}
}
}
あなたはポイントフリースタイルは、より「流暢」と読みやすくなります見ることができます。