2017-06-12 10 views
2

私はRamda関数でこの動作を観察しましたが、それをかなり理解できませんでした。以下のバイナリ関数のためRamda関数に空のパラメータが与えられたらどうなりますか?

const t1 = (a) => R.cond([ [R.T, R.identity] ]); 

両方のパラメータが与えられた場合に予想されるように、例えば、

t1(1)({}) 

{}を返します。このよう

t1(1)() 

と呼ばれる場合

しかし、それは[Function: f1]返します。

ここでは実際に何が起こっていますか? 2番目のパラメータはデフォルトに設定されていますか、まったく供給されなかったかのように扱われますか?

Ramdaに2番目のパラメータのデフォルト値を明示的に設定する方法はありますか(たとえば、{})?

+1

@cubrrありがとう、ちょうどタイプミスを修正しました – tinlyx

答えて

2

まず、私はあなたの機能を理解していません。 R.cond([ [R.T, R.identity] ])は、本質的にアイデンティティ関数であるものを書くのにやや奇妙な方法です。 condは通常、通常、デフォルトとして最後のもののための述語R.Tを使用して、複数の述語とアクションのペアを取る(switch文のdefault場合に類似。)このアップ(a) => R.cond([ [R.T, R.identity] ])

ラッピングは、単にあなたにあなたの機能を提供しますあなたが好きな引数を渡します。すぐに無視され、その奇妙な同一性関数を返します。

RAMDAによって作成された多くの機能と同様に、condの出力を使用すると、さまざまな方法で関数を呼び出すことが可能なカリー化のRAMDAの拡大概念を使用して、カレー機能です。例えば、g = curry(function f(a, b, c) {/* ... */})場合、これらのすべては、f(a, b, c)と同等です:

g(a, b, c) 
g(a, b)(c) 
g(a)(b, c) 
g(a)(b)(c) 

そして、あなたはパラメータの完全な補完よりも少ないで呼び出した場合、あなたは別の機能を取り戻す:

g(a); //~> curry((b, c) => f(a, b, c)) 
g(a, b); //~> curry((c) => f(a, b, c)) 

これが伸びますパラメータをまったく指定しなくても:

g(); //~> curry((a, b, c) => f(a, b, c)), 

この最後のことは気付いていることです。 t1(1)は、その奇数の同一性R.cond([ [R.T, R.identity] ])を返します。この関数はカリーされているので、パラメータなしで呼び出すと、同じアイデンティティ関数に相当するものが返されます。

これは、関数がなぜ動作するのか説明する必要があります。私はあなたが解決しようとしている根本的な問題を知ることができないので、助ける方法がわかりません...

デフォルトを言及していることを除いて、RamdaのdefaultToが助けになる可能性があります。

関連する問題