定义Monad功能?

时间:2017-10-09 20:57:40

标签: j

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)

鉴于v和d,   第一列力给出了来自v。

的第(n + 1)个向量

第二列力给了我们来自v。

的每个向量

第3列力给了我们两个向量之间的常数。

也就是说,(1 2);(1 2)在第3列强制上有1,但(1 2);(3 4)可能没有。   我想制作一个monad函数给我们

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

如果我们输入force_constant 1

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

如果我们输入force_constant 2

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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或相关谓词将这些数组作为输入。最简单的方法是将monad更改为dyads,让vd作为左参数x¹进入。

¹但我们现在可以保持简单。如果您想获得有关代码的更多反馈,请随时在http://codereview.stackexchange.com/上发布。