3

次の J 式があるとします。

# 3 ((|=0:)#]) 1+i.1000

これは、3 で割り切れる 1 から 1000 までの数字の数数えます

次のように、これに対してモナド関数を定義するとしましょう。

f =: モナドの定義
# y ((|=0:)#]) 1+i.1000
)

これは、単一の引数でうまく機能します。

    f 4
250

リストを渡すと、長さエラーが発生します。

    f 1 2 3
|長さエラー: f

これで、長さエラーが発生する理由が完全にわかりました。モナド1 2 3の引数をリストに置き換えると、次のようになります。y

# 1 2 3 ((|=0:)#]) 1+i.1000

J について何か知っていれば、長さのエラーが発生する理由は明らかです。ですから、その説明は必要ありません。

リストを渡すとリストが返されるように関数を定義したい。

   f 1 2 3
1000 500 333

(a) リストを取得してリストを返すようにこの関数を再定義するか、(b) 副詞やその他の手法を使用して、再定義せずに関数をそのままリストで機能させるにはどうすればよいですか?

4

2 に答える 2

2

動詞をランク 0 として定義する、より単純なアプローチをお勧めします。あなたが提供した動詞を使用して、これを行う簡単な方法を次に示します。

   f =: monad define "0
# y ((|=0:)#]) 1+i.1000
)

   f 1 2 3
1000 500 333

唯一の変更点は、"0'define' という単語の後に追加されたことです。

于 2010-08-16T22:11:15.500 に答える
1

これは(b)の場合です:

    (f@{. , $:@}.) ^: (0 < #) 1 2 3
1000 500 333
于 2010-05-21T12:08:17.750 に答える