在回答FoldList like primitive in J的问题时,我想创建一个副词fold
,以便x u fold y
将y
与动词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
这里有什么问题?感谢。
答案 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 define
和conjunction define
(对于单行,您可以使用{{1代替def
)。