web-dev-qa-db-ja.com

「関数型プログラミング」の「ポイントフリー」スタイルとは何ですか?

私が最近気付いたフレーズは、「ポイントフリー」スタイルのコンセプトです...

まず、 これ の質問と これも の質問がありました。

その後、私は here を発見しました。彼らは、「議論する価値のあるもう1つのトピックは、著者によるポイントフリースタイルの嫌いです」と述べています。

「ポイントフリー」スタイルとは?誰かが簡潔に説明できますか? 「自動」カレーとは何か関係がありますか?

私のレベルのアイデアを得るために-私は自分でSchemeを教えており、簡単なSchemeインタープリターを書きました...私は「暗黙の」カレーが何であるかを理解していますが、HaskellやMLを知りません。

94

Wikipediaの記事 を見て、定義を取得してください。

暗黙的プログラミング(ポイントフリープログラミング)は、変数の代わりにコンビネーターと関数構成[...]を使用して、関数定義に引数に関する情報が含まれないプログラミングパラダイムです。

Haskellの例:

従来型(引数を明示的に指定します):

_sum (x:xs) = x + (sum xs)
sum [] = 0
_

ポイントフリー(sumには明示的な引数はありません-これは_+_が0で始まるフォールドです):

_ sum = foldr (+) 0
_

あるいはもっと簡単です:g(x) = f(x)の代わりに、単に_g = f_と書くこともできます。

そうはい:それはカレー(または関数合成のような操作)と密接に関連しています。

63
Dario

ポイントフリースタイルとは、定義されている関数の引数が明示的に言及されておらず、関数が関数構成によって定義されていることを意味します。

次のような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
30
sth

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'

参照

11
Brunno

ポイントフリースタイルとは、存在して使用されている場合でも、コードが引数を明示的に言及しないことを意味します。

これはHaskellで機能します。

例えば:

myTake = take

は1つの引数を取る関数を返すため、必要な場合を除いて、引数を明示的に型指定する必要はありません。

5
Rayne