私が最近気付いたフレーズは、「ポイントフリー」スタイルのコンセプトです...
その後、私は here を発見しました。彼らは、「議論する価値のあるもう1つのトピックは、著者によるポイントフリースタイルの嫌いです」と述べています。
「ポイントフリー」スタイルとは?誰かが簡潔に説明できますか? 「自動」カレーとは何か関係がありますか?
私のレベルのアイデアを得るために-私は自分でSchemeを教えており、簡単なSchemeインタープリターを書きました...私は「暗黙の」カレーが何であるかを理解していますが、HaskellやMLを知りません。
Wikipediaの記事 を見て、定義を取得してください。
暗黙的プログラミング(ポイントフリープログラミング)は、変数の代わりにコンビネーターと関数構成[...]を使用して、関数定義に引数に関する情報が含まれないプログラミングパラダイムです。
Haskellの例:
従来型(引数を明示的に指定します):
_sum (x:xs) = x + (sum xs)
sum [] = 0
_
ポイントフリー(sum
には明示的な引数はありません-これは_+
_が0で始まるフォールドです):
_ sum = foldr (+) 0
_
あるいはもっと簡単です:g(x) = f(x)
の代わりに、単に_g = f
_と書くこともできます。
そうはい:それはカレー(または関数合成のような操作)と密接に関連しています。
ポイントフリースタイルとは、定義されている関数の引数が明示的に言及されておらず、関数が関数構成によって定義されていることを意味します。
次のような2つの関数がある場合
square :: a -> a
square x = x*x
inc :: a -> a
inc x = x+1
これらの2つの関数をx*x+1
を計算する関数に結合する場合は、次のように「ポイントフル」に定義できます。
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
は1つの引数を取る関数を返すため、必要な場合を除いて、引数を明示的に型指定する必要はありません。