https://github.com/hemanth/functional-programming-jargonの説明はあいにくあまり正確ではありません。
尖ったファンクタ本当にあらゆるタイプa
に対して定義された関数of
、及びタイプF a
の値of(x)
にタイプa
の値x
を送信するとともにファンクタF
あります。 Hindley-Milner signatureでは、それは次のようになります。例えば
of :: a -> F a
、アレイファンクタは、任意のタイプa
のすべての値x
のために定義され、of = x => [x]
と指摘しています。
さらに、機能of
(またはより正確には、機能of
のコレクションは、あなたは、各タイプa
に1つを持っているとして)F
にアイデンティティ数子から自然形質転換する必要があります。これは、関数の値のof
は、同じ機能の上にマッピングされた引数のof
に等しいことを意味します
例えば
of(f(x)) === of(x).map(f)
、アレイの例では、あなたが
[f(x)] === [x].map(f),
を持っているので、x => [x]
は確かに自然形質転換です。
しかし、あなたはまた、ファンクタのmap
が同じであっても、別の尖ったファンクタである
of = x => [x, x]
[f(x), f(x)] === [x, x].map(f)
を取ることができます。 (どちらの場合でも、値がof(x)
の非常に特殊な配列しか得られません)。
ただし、
今
of = x => [x, 0]
[f(x), 0] !== [x, 0].map(f)
var grid = Grid.of({ width: 2, height: 2, list: [1, 2, 3, 4] })
完全に大丈夫ですとGrid
にラップ渡されたあなたのオブジェクトを返します。 grid
と通常の関数f
をプレーンオブジェクトからプレーンオブジェクトにマップすると、自然変換法のためにf
を適用し、Grid
にラップするのと同じ結果になります。この方法では、Grid.of({width: 2})
のような他の値でGrid.of
を呼び出すこともできます。Grid.of(2)
です。または、Grid.of
が定義されているタイプを制限することができます。値は、許可するタイプの値でなければなりません。
この1つは少しトリッキーです:
Grid.of(2, 2, [1, 2, 3, 4])
これは、いくつかの引数にGrid.of
を適用します。Grid.of
は1つの引数だけの関数であるため、結果はGrid.of(2)
になります。あなたが本当にすべての値を供給したい場合は、おそらくあなたが内部の配列にそれらを事前にラップしてからGrid.of
を適用することによって、複数の引数にGrid.of
を拡張することができ、また
Grid.of([2, 2, [1, 2, 3, 4]])
を書きたいです。それは本当にあなたが何をしているかによって異なります。
実際の使用例については、たとえばhereここで、「退屈な」タスクは、平方の値からTask.of
によって定義されます。一方、hereは、Task.of
で取得できない関数をラッピングする、より興味深いタスクです。しかし重要なことは、両方のタスクが両方の例に示されているように同じ統一インターフェースで使用できることです。
また、これらの例ではアプリケーションファンクタは使用されていないので、依然として適用可能ではない尖ったファンクタの使用があります。
「Foo.of」とは何ですか?あなたはArray.ofを意味しましたか?私はEs2015の時点で、Arrayと* TypedArray *には 'of'があると思ったのです –
あなたの期待する出力は?あなたのポイントをあまり得ていない。 – Leo
あなたの入力データの例と期待される結果の配列内容を挙げてください。あなたが私に 'Foo'と混同させてしまいました。 –