2009-06-03 6 views
68

私は最近気づいたフレーズは「ポイント自由」スタイルのコンセプトです...Functional Programmingのポイントフリースタイルとは何ですか?

はまず、this質問、およびalso this oneがありました。

次に、私はhereを発見しました。「議論する価値のあるかもしれない別のトピックは、ポイントフリースタイルの嫌悪感です。」

「ポイントフリー」とは何ですか?誰かが簡潔な説明をすることができますか?それは "自動"カリングとは何か関係がありますか?

私は自分のスキルを教えていて、シンプルなSchemeインタプリタを書いています...私は "暗黙の"カリングが何かを理解していますが、私はHaskellやMLを知らない。

+2

ちょうど注記:なぜそれが_pointfree_と呼ばれているかを見るために[Pointfree/but pointfreeにはより多くのポイントがあります!](http://www.haskell.org/haskellwiki/Pointfree#But_pointfree_has_more_points.21)をHaskellWikiでご覧ください。 –

答えて

52

ちょうどあなたの定義を取得するためにWikipedia articleを見て:

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

Haskellの例:

従来の(明示的に引数を指定):

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

がポイントフリー(sumは、明示的な引数を持っていない - それが始まる+とちょうど倍です0):

sum = foldr (+) 0 

g(x) = f(x)の代わりにあなたはg = fと書くことができます。

だからはい:これは、カリング(または、機能構成のような操作)と密接に関連しています。

+8

ああ私は見る!したがって、引数を宣言するのではなく、他の関数を組み合わせるだけで、常に新しい関数を構築できます。 –

+14

私がプログラミングしているときに、変数/引数の新しい名前を考え出すのは本当に嫌です。それが私がポイントフリースタイルを愛する大きな理由の1つです! – Martijn

+1

どのようにしてカレー化に関係していますか? – kaleidic

24

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

square :: a -> a 
square x = x*x 

inc :: a -> a 
inc x = x+1 

よう

次の2つの機能を持っている場合、あなたはx*x+1計算1にこれらの二つの機能を結合したい場合、あなたはそれを「ポイント・フル」のように定義することができます。

f :: a -> a 
f x = inc (square x) 

ポイント-無料の代替は、引数xについて話をしないで次のようになります。

f :: a -> a 
f = inc . square 
+14

愚かなことに、ハスケルでは、「ポイントフリー」のやり方は通常、よりポイントが多い(より多くのピリオド)ようです。この煩さは優れたニーモニックを作ります。 (本の本​​は、これについてのHaskellのコメントです) – Dan

+2

@Panfree(http://www.haskell.org/haskellwiki/Pointfree#But_pointfree_has_more_points.21)HaskellWikiページには、 _pointfree_と呼ばれます。 –

+2

@ダン:ハスケルポイントは "そのサークル演算子"であることが意図されているので、馬鹿だとは思わない。しかし、混乱するのは、特に関数型プログラミング言語が初めての場合です。 haskellのすべてのイントロブックはポイントフリースタイルを説明する必要があります。 –

4

ポイントフリースタイルは、コードが存在し、使用されているにもかかわらず、コードが明示的にその引数を記述しないことを意味します。

これは、関数の働きにより、Haskellで動作します。例えば

myTake = take 

したがって、明示的な型への理由は、あなたがあまりにもしない限り、引数がない、一つの引数を取る関数を返します。

+1

'myShow = show'のように、Haskell 98で動作しないことがあります。 [Haskell wiki](http://www.haskell.org/haskellwiki/Monomorphism_restriction)に詳しい情報があります。 –

4

アンJavaScriptのサンプル:ここに

//not pointfree cause we receive args 
var initials = function(name) { 
    return name.split(' ').map(compose(toUpperCase, head)).join('. '); 
}; 

//pointfree 
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' ')); 

initials("hunter stockton thompson"); 
// 'H. S. T' 

Reference

0

は、他のライブラリなしで活字体で一例です:

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; 
    } 
    } 
} 

あなたはポイントフリースタイルは、より "流暢" で見ることができます読みやすい。

関連する問題