2017-10-09 4 views
2
v=: ((1 2);(3 4);(0 5);<(2 1)) 
d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 
force=:(v ((0{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(0{d) 
force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d) 
force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d) 
force=:(v ((3{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(3{d) 
force=:(v ((4{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(4{d) 
force=:(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d) 

、力の 1列目は、米国を与える(N + 1)Vからベクトル番目。力のモナド関数の定義?力のV及びDが与えられると

2番目の列は、Vから私たち各ベクトルを与える。

3列2つのベクトルの間に定数を与えます。

つまり、(1 2);(1 2)は3番目の列に1を持ちますが、(1 2);(3 4)はそうではありません。 私たちはforce_constant 2

は、誰かが助けてもらえ入力した場合、我々はforce_constant 1

またはforce=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d)

を入力する場合は、私たちに

force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d)

を与えるモナド関数を作りたいですか?

答えて

4

あなたはすでに自分で書いています。ただ、forceの最終的なバージョン、あなたがyを使って書いたものを取る、と明示的な定義でラップ:

v =: ((1 2);(3 4);(0 5);<(2 1)) 
    d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 

    force_constant =: monad def '(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d)' 

    force_constant 1 
+---+---+----+ 
|3 4|1 2|0.5 | 
+---+---+----+ 
|3 4|3 4|1 | 
+---+---+----+ 
|3 4|0 5|0.75| 
+---+---+----+ 
|3 4|2 1|0.25| 
+---+---+----+ 

    force_constant 2 
+---+---+----+ 
|0 5|1 2|1 | 
+---+---+----+ 
|0 5|3 4|0.75| 
+---+---+----+ 
|0 5|0 5|1 | 
+---+---+----+ 
|0 5|2 1|0 | 
+---+---+----+ 

は今、この製剤は、名詞に依存vdは、グローバルに定義されています。それらを変更して、force_constantまたは関連する動詞がこれらの配列を入力として受け取るようにするとよいでしょう。最も簡単な方法は、モナドをダイアドに変更し、vdを左の引数として、x ¹とします。


¹ しかし、私たちは今のところそれをシンプルに保つことができます。あなたのコードにもっとフィードバックしたい場合は、http://codereview.stackexchange.com/に投稿してください。

+1

私は、コードレビューを調査するDanの提案を2回目にします。例を挙げると、このバージョンは、暗黙のうちに調べたり、引数として 'v'と' d'を与えることなく、上の動詞を単純化したものです: 'force_constant =:monad def '((y {v)、。 <"0 > y {d'' – Tikkanz

+0

@Tikkanz私はそれ以上のことをして箱を捨てるように誘惑されるだろう。 M x N x 2の整数の配列にします。距離平面にダミー列( '0's)を追加して、それを規則的にします。 –

関連する問題