回答FoldList like primitive in J的问题,我想创建一个副词 fold
,这样 x u Fold y
就是用动词 u
和 inital 折叠 y
值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
。您的 2 : 0
定义的是连词,而不是副词。现在的情况是,J 期望 fold
有两个直接参数,而您只提供了一个(+
;这两个数字数组是间接的,而不是直接的,论据)。然而,这并不是 J 在这里提示的,因为另一个问题实际上首先把它绊倒了。我稍后会介绍这一点,但您需要做的第一件事是将 fold
定义为副词 [1]。
J 提示的更直接的问题是它不知道 x
的含义。为什么?出于同样的原因,如果您替换 2 : 0
(或 conjunction Define
),甚至更相关的是,adverb Define
- - 使用动词定义
。因为显式动词(直接或派生)默认为一元并且没有 x
参数(因此提及 x
是值错误)。如果您想定义二元动词,则必须明确要求。
现在,直接定义二元动词非常简单:您只需说二元定义
,而不是说动词定义
。但是从修饰语(副词或连词)派生二元动词就不那么明显了。您必须使用special colon syntax它允许您区分显式定义的单价和二价。此语法适用于所有显式定义,包括动词、副词和连词,但对于副词和连词,这是派生显式动词的唯一方法。
底线:
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]:您可能会发现使用名称类的标准覆盖更容易记住(并稍后阅读),如副词定义
和连词定义
(对于一个-衬垫,您可以使用 def
代替 define
)。
关于j - J 中的foldList 副词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23353755/