2016-05-15 3 views
3

のコレクション:その製品これが私の最初の試みだった10.その後、小さい10その後、以下の数字のすべてのペアを見つける:フィルター私はジュリアで反復可能オブジェクトと理解して遊んで、簡単な問題をコーディングしようとしたんだタプル

solution = filter((a,b)->a*b<10, product(1:10, 1:10)) 
collect(solution) 

しかし、「引数の数が間違っています」というエラーが表示されます。これは、フィルタ内の匿名関数が2つの引数を必要とするが、1つのタプルを取得するため、予想されます。 は私が

solution = filter(p->p[1]*p[2]<10, product(1:10, 1:10)) 

を行うことができます知っているが、それは上記の一つとして見栄えしません。 (a、b)がタプル型の引数で、最初の例で構文に似た何かを使うことができる方法はありますか?

+2

この例では、関数の本体を調整することもできます: 'a - > prod(a)<10'ですが、' @ tup'の例はきれいです。 – jverzani

答えて

4

私はあなたが好きなように正確行う方法はないと思うが、ここであなたが匿名関数のために検討することもでき、いくつかの選択肢です:

x->let (a,b)=x; a*b<10 end 
x->((a,b)=x; a*b<10) 

があれば、もちろんこれらの缶はマクロにすることあなたは好きです:

macro tup(ex) 
    @assert ex.head == :(->) 
    @assert ex.args[1].head == :tuple 
    arg = gensym() 
    quote 
     $arg -> ($(ex.args[1]) = $arg; $(ex.args[2])) 
    end 
end 

次に、@tup (a, b) -> a * b < 10は好きなように行います。

Metaprogrammingジュリアは、あなたが何か何度も何度も何度もやっていることのために、非常に便利で一般的なものです。しかし、新しい構文を追加すると新しい構文を学ぶことができ、コードを読みにくくすることができるため、これは単発的であれば、このようなメタプログラミングを避けることになります。

関連する問題