函数和模数的J语法

时间:2011-10-28 17:51:19

标签: function syntax modulo j

我正在尝试创建一个返回输入模3的函数mod3,但我的语法错误。我不明白为什么语法与文档中的double示例有任何不同。

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

3 个答案:

答案 0 :(得分:5)

&(bond)用于将名词绑定到动词时,它实质上是创建一个带有“固定”左(或右)参数的新动词。因为乘法是可交换的,所以将2固定为左或右参数并不重要,因此以下内容是等效的:

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

然而,残差(|)不是可交换的,因此在您的情况下,您必须确保修复/绑定(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

答案 1 :(得分:0)

我不确定为什么J(一种占主导地位的前缀语言)使用这种语法,但是邮件列表说使用这个版本,它可以工作。

mod3 =: 3 & |

答案 2 :(得分:0)

正如我所看到的那样,当你有一个二元动词,并且你将一个论证联系起来时,它就变成了一个单调动词。 Monadic动词总是将其论证作为y(J术语),或者在右边。

实施例:        ^& 3] 4     64  ]将3 4分开,使它们不被视为单个数字。我从一个二元动词,力量开始,把x带到y的力量。通过添加绑定,我创建了一个monadic动词,根据它的定义,将y带到第三个幂。

    3&^ 4
81

这基本上是相同的例子,除了现在我的monadic动词是“以3为中心”。

这个双重例子(更简洁的+ :)正试图展示的正是我们所展现的:一个二元动词被转换成一个带有键的一元动词总是采用它需要执行的单个参数作为一个权利论证,无论第一个论点与哪一方联系在一起。

它没有显示的是,对于不可交换的动词,将原始参数绑定到哪一方很重要。但现在你知道了。 : - )