1

我将用简单的英语解释我的问题,然后在 J 中展示我的尝试。

将 1 和 0 列表中 1 的索引相加,看看它们是否等于另一个数字。 例如,给定 1 0 1 1 0,索引是 0,2 和 3,它们的总和是 5。所以我可以测试它是否符合另一个数字(在这种情况下,显然只有 5 才是正确的)。

这是我的J:

indexsumtest =: =+/I.
v =: 1 0 1 1 0
   5 indexsumtest v
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

什么?在这里我假设 indexsumtest 是一个二元动词,也许我需要明确输入 x 和 y?

 indexsumtest =: x =+/I. y
   5 indexsumtest v
|value error: x
|   5     indexsumtest v

没有。这让事情变得更糟。

所以我从头开始:

I. v
0 2 3

正确的!

+/I. v
5

再更正。

5 =+/I. v
1

1 表示真实。所以我做对了。

为什么我不能将这三个操作压缩成一个动词?

4

3 回答 3

3

它时不时地咬住每个人,结果是因为

5 =+/I. v

实际上有 I. 作用于 v,然后由 +/ 作用于结果,然后使用 = 比较对该结果与 5 进行测试。所以当我们定义

   indexsumtest =: =+/I.

我们得到

      5 indexsumtest v
   0 0 0 0 0
   0 0 0 0 0
   0 0 0 0 0
   0 0 0 0 0
   0 0 0 0 0

因为 indexsumtest 已被定义为一个默认动词,它按照 MPelletier 的建议将其参数处理为一个分叉。换句话说,你实际上没有得到 =+/I。代替 indexsumtest 你会得到 (=+/I.) 这是一个 3 动词分叉,其中第一个和第三个动词同时接受两个参数,每个参数的结果被发送到中心的 +/。

MPelletier 还建议做你想要的默认形式是

[ = [: +/ [: I. ]

如果您将定义更改为 13,它将起作用并且实际上是由 J 创建的

indexsumtest =: 13 : 'x =+/I. y'
indexsumtest
[ = [: +/ [: I. ]

是的,没错,如果您使用 13 : 连词来定义,J 实际上会为您进行大多数默认转换。很酷,嗯?唯一的问题是它在这个自动生成中没有使用钩子,这可以简化代码。钩子是两个动词组合,其右动词作用于右参数,结果用作左动词的右参数,在二元情况下使用左参数(或在单子情况下使用原始右参数) .

当 x 和 y 是左右参数并且 u 和 v 是第一个和第二个动词时

x ( u v) y变成x u (v y)

或在单子情况下

( u v) y变成y u (v y)

如果你还在我身边(对你有好处!)这意味着如果我们将 u 设置为 = 并将 v 设置为 +/@I,我们可以使用挂钩来简化默认。(@ 是连接 +/ 和 I. 的连词,使它们作为一个动词工作)。所以最后

   indexsumtacit =: = +/@I.
   5 indexsumtacit v
1

当你开始时就像 J 一样令人费解,当你了解它所遵循的规则然后开始让他们做你的竞标时,它真的很整洁。希望这可以帮助。

于 2013-05-23T05:23:56.800 回答
1

考虑经典的均值函数:

mean =: +/%#
mean i.6

像这样的 3 部分声明以这种方式运行:

  • #是针对y
  • +/是针对y
  • %是根据各自的结果+/#在各自的地方进行的

原理与您的二元函数相同:

  • I.针对x和 执行y
  • =针对x和执行y
  • +/是根据各自的结果=I.在各自的地方进行的

所以,做

indexsumtest =: =+/I.
5 indexsumtest 1 0 1 1 0

相当于

(5 = 1 0 1 1 0) +/ (5 I. 1 0 1 1 0)

远非你想要的。

简单的技巧是明确定义一个二元函数:

indexsumtest =: 4 : 'x =+/I. y'

J 的默认定义也暗示了这一点:

[ = [: +/ [: I. ]

这对我的口味来说有点重。

于 2013-05-21T14:42:18.720 回答
0

这完全是关于 J 如何解析表达式。当 J 看到一个动词时,它会隐含地在它周围添加一个括号。5 indexsumtest v也是如此5 (=+/I.) v;而5 =+/I. v实际上是5 =+/ (I. v)。这两个与上面的答案不同。

我发现通过阅读Learning J 的附录 1来理解 J 如何评估表达式非常有帮助。这值得一整章,而不是任何 J 教程的附录。

于 2013-06-03T13:30:24.430 回答