J中的foldList副词

时间:2014-04-29 01:01:15

标签: j

在回答FoldList like primitive in J的问题时,我想创建一个副词fold,以便x u fold yy与动词u和inital一起折叠价值x

    fold =: 2 : 0
z =.x
for_item. y do. z =. z u item end.
z
)

但是在尝试时我遇到了错误:

   1 (+fold) 1 2 3
|value error: x
|   z=.    x

这里有什么问题?感谢。

1 个答案:

答案 0 :(得分:4)

只是一些小事。

首先,副词的数字代码为1。你拥有的2 : 0是定义一个连词,而不是一个副词。它现在的方式,J期待fold的两个直接参数,并且你只提供了一个(+;两个数值数组是间接的,而不是直接的参数)。然而,这并不是J在这里抱怨的,因为另一个问题实际上是先把它绊倒了。我会在一秒钟之内完成,但是你需要做的第一件事就是将fold定义为副词[1]。

J抱怨的更直接的问题是它不知道x的含义。为什么?出于同样的原因,如果您使用2 : 0替换conjunction define(或adverb define) - 甚至更有针对性地verb define - 。因为显式动词(直接或派生)默认为 monadic 且没有x参数(因此提及x是值错误)。如果要定义二元动词,则必须明确要求它。

现在,直接定义二元​​动词很简单:不是说verb define,而是简单地说dyad define。但是从修饰语(副词或连词)中得到一个二元动词有点不那么明显了。您必须使用special colon syntax,它允许您分离显式定义的monadic和dyadic效价。此语法适用于所有显式定义,包括动词,副词和连词,但对于副词和连词,它是唯一方式派生显式动词。

底线:

fold =: adverb define
  NB. Note solitary colon on next line. Everything after that is dyadic.
:
  z =.x
  for_item. y do. z =. z u item end.
  z
)

[1]:您可能会发现使用标准类的标准封面更容易记住(以及稍后阅读),如adverb defineconjunction define(对于单行,您可以使用{{1代替def)。