2011-01-27 3 views
3

に純粋な機能の複数のレベルでスロットを区別するためにどのように、私はここで例えばMathematicaの

{1, 2, 3, 4, 5} // Select[#1, ((*** + 1 &) > 2) &] & 

を有していてもよく、***も1位になりたいと思っているが、最外層の第1位として認識されていません。 2つを区別する方法はありますか?

ありがとうございました。

+0

あなたが望む結果を投稿すると、質問が分かりやすくなります –

+0

そこに2つの良い答えがあります。 @Leoは、ネストされた匿名関数が通常間違っているものに答える。 @ティモは、Qiang Liの特定のコードビットで何が問題になったのかを認識しました。 – Simon

+0

投稿したコードスニペットは '{1,2,3,4,5}と同じですか?// [#1、#> 1&]&'を選択しますか? – Simon

答えて

6

私はこの質問を理解していません。あなたの期待される出力は?... 2,3,4,5} ...もしそうなら、スロット間の論理的な混乱はありません。リスト内の最初の引数であるSelectのすべての要素は、 2番目の引数)。ちょうど罰金以下の作品:場合

{1, 2, 3, 4, 5} // Select[#, ((# + 1) > 2) &] &

が、これまで対立を生じ、代わりにスロット/アンパサンド表記の、あなたは例えば、Function[{x,y,...},...]表記を使用することができます

{1, 2, 3, 4, 5} // Select[#, Function[{x}, (x + 1) > 2]] &

+1

また、Function []表記を使用すると、混乱した場合に備えて、一般に匿名関数を整理することができます。たとえば、元の '((+ 1&)> 2)&'(Timoが指摘しているように意味がない)は と等価です 'Function [{x}、Function [{y}、 y + 1)]> 2]] ';この表記で間違いが(うまくいけば)見やすくなります。 –

3

あなたは、

{1, 2, 3, 4, 5} // Select[#1, ((# + 1) > 2) &] & 

リストから要素をピックアップして比較テスト関数に渡し#1この方法を試してみてください、あなたのコード内の1つの非常に多くのアンパサンドを持っています。したがって、実際には#1#は同じ要素を取得します。

((# + 1&) > 2)&は、外部関数が引数を渡すことができないので、比較関数として持つことは実際的ではありません。あなたは効果的に(F > 2)&と書いてあり、Fが純粋な関数であっても、その引数のためのスロットはありません。働くために((# + 1&[#]) > 2)&と書く必要があります。それは(F[#] > 2)&に相当します。