jのリストで動作するモナディック関数を定義するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2869487

  •  03-10-2019
  •  | 
  •  

質問

次のj式があるとしましょう。

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

これにより、1〜1000の数の数が3で均等に割り切れます(今、誰もがこれを行う簡単な方法があると指摘する前に、この質問は jの構文, 、 と いいえ 数学。)

次のように、このためのモナディック機能を定義しているとしましょう。

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

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

    f 4
250

リストを渡すと、長さエラーが表示されます。

    f 1 2 3
|length error: f

今、私はなぜ私が長さのエラーを得るのかを完全に理解しています。リストを置き換えるとき 1 2 3 のために y モナドの議論、あなたは取得します:

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

Jについて何か知っている場合、長さエラーが発生している理由はかなり明確です。だから、私はそれの説明を必要としません。

リストを渡すときにリストを返すように関数を定義したいと思います。

   f 1 2 3
1000 500 333

(a)この関数を再定義してリストを取得してリストを返すか、(b)おそらく副詞やその他の手法を使用して、再定義されずにリストの機能を取得することができますか?

役に立ちましたか?

解決

これは(b)ケースのためです:

    (f@{. , $:@}.) ^: (0 < #) 1 2 3
1000 500 333

他のヒント

動詞をランクゼロとして定義するというはるかに簡単なアプローチをお勧めします。提供した動詞を使用して、それを行う簡単な方法があります。

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

   f 1 2 3
1000 500 333

唯一の変更はです "0 「定義」という言葉の後に追加されました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top