【问题标题】:foldList adverb in JJ中的foldList副词
【发布时间】:2014-06-14 17:55:58
【问题描述】:

针对FoldList like primitive in J的问题,我想创建一个副词fold,这样x u fold y就是将y与动词u和初始值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

这里有什么问题?谢谢。

【问题讨论】:

  • 顺便说一句,您可以在 table:/ 上使用 u~ 来获得相同的结果:fold =: 1 : 'u~/ |. y',现在,{.y 是初始值。

标签: j


【解决方案1】:

只是一些小事。

首先,副词的数字代码是1。您拥有的 2 : 0 定义的是连词,而不是副词。现在的情况是,J 期望 fold 有两个直接参数,而您只提供了一个(+;这两个数值数组是间接的,而不是直接的参数)。然而,这不是 J 在这里抱怨的,因为另一个问题实际上是首先把它绊倒。我稍后会讲到,不过您需要做的第一件事是将 fold 定义为副词 [1]。

J 抱怨的更直接的问题是它不知道您所说的x 是什么意思。为什么?出于同样的原因,如果您将2 : 0(或conjunction define)——或者更准确地说,adverb define——替换为verb define。因为显式动词(直接或派生)是默认情况下是一元的,并且没有x 参数(因此提及x 是一个值错误)。如果你想定义一个二元动词,你必须明确地要求它。

现在,直接定义二元​​动词很简单:不要说verb define,而只需说dyad define。但是从修饰语(副词或连词)派生出二元动词就不太明显了。您必须使用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]:您可能会发现使用名称类的标准封面更容易记住(并稍后阅读),如adverb defineconjunction define(对于单行,您可以使用def 代替@ 987654340@)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2015-05-24
    • 2018-06-22
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多