2011-10-28 14 views
3

入力モジュロ3を返す関数mod3を作成しようとしていますが、構文が間違っています。私はなぜ構文が文書のdoubleの例と異なっているのかわかりません。関数とモジュロのJ構文

$ jconsole 
    double =: * & 2 
    double 1 
2 
    double 2 
4 
    double 3 
6 
    mod3 =: 3 | & 
|syntax error 
| mod3=: 3|& 

答えて

5

。あなたのケースであなたが確認する必要がありますので、

double1= *&2  NB. new verb "times by 2" 
    double2=: 2&* NB. new verb "2 times" 
    double1 4 
8 
    double2 4 
8 

しかしresidule(|)は可換ではありません:乗算は可換であるため、以下は等価ですので、あなたが左または右の引数として2を修正するかどうかは関係ありません。望ましい結果(3で割った数)の残りの部分を取得する|の左引数として/結合(3を修正。

modulo3=: 3&| NB. new verb "remainder after divison by 3" 
    modulox=: |&3 NB. new verb "remainder of 3 divided by" 
    modulo3 7 
1 
    modulox 7 
3 
+0

'|'が左の引数と右の引数を取る場合、なぜ '3 | 2'はそれ自身で動作しますが、関数を定義するときには '3&'のpostixを使う必要がありますか?それは矛盾している。 – mcandre

+0

正直言って私はあなたが何を不明確にしているのか理解するのに苦労しています。私は、あなたがJ以外の構文規則に適合することを期待していると思われ、それがJのパラダイムを理解できなくなっています。 '|'で使用する左の引数を指定する必要があるので、左の引数をバインドするために '&'を使用します。もう一つの方法は、forkを使って 'mod3 =:3 | ] ' – Tikkanz

+0

私はあなたの視点を理解するのに苦労している理由は、接頭辞/接尾辞/接尾辞の用語で私の経験が限られているということです。なぜ '3&'が "postfix"なのか説明できますか?あなたは '&'という結論の観点から、その文は中置であると主張できませんでしたか? – Tikkanz

0

J、主に接頭語は、この構文を使用して、なぜ私はわからないんだけど、メーリング・リストには、このバージョンを使用するように言って、それが動作します。 &(結合)が、それは基本的に「固定」の左(または右)引数で新しい動詞を作成している動詞に名詞を結合するために使用される

mod3 =: 3 & | 
0

ポイントを、私はそれを見るように、あなたは二項を持っている場合ということです動詞、それに引数を付けると、それはモナド動詞になります。モナド動詞常にy(J用語)としての議論を持っています。

例: ^ & 3] 4 64ザ]それらは単一の数字として見ないように3 4を分離します。私は二項動詞で始まり、力、xをy力に乗じる。バインドを追加することで、私はモナドの動詞を作成しました。その動詞の定義によれば、3番目の動詞にyをとります。

3&^ 4 
81 

これが今の私のモナド動詞は「Y電源に3を取る」ことを除いて、基本的に同じ例です。

表示しようとしていた二重の例(+ :)が表示しようとしていたのはまさに私たちが示しているものでした。最初の議論がどの辺に結びついても、右の議論。

何も表示されないのは、可換でない動詞の場合、元の議論をどの側にバインドするかということです。しかし今、あなたは知っています。 :-)