这是一个朴素的斐波那契数列:
(,[:+/_2&{.)^:10]0 1 NB. 10 + 2 elements
0 1 1 2 3 5 8 13 21 34 55 89
这是它的显式单子(monad)版本:
3 :'(,[:+/_2&{.)^:y 0 1' 10
0 1 1 2 3 5 8 13 21 34 55 89
问题是:在默认定义中,我能否以某种方式为^:
连词提供最右边的参数,以便(脱离我的头脑):
((,[:+/_2&{.)^:y 0 1)10
0 1 1 2 3 5 8 13 21 34 55 89
会产生预期的结果吗?或者,更正确的定义(再一次,脱离了我的头脑):
((,[:+/_2&{.)^:(y-2)1 1)10
1 1 2 3 5 8 13 21 34 55
更一般地说:是否可以默认定义 J 中的副词和连词,还是只有明确定义才有可能?
我的直觉(以及来自 this 问题的 Material )告诉我,我应该去黑暗的一面,学习更多关于动名词和 `
/`:
连词的知识。那是对的吗?如果是这样,我将不胜感激任何关于此事的新手友好 Material :)
最佳答案
我认为我的自然方法是创建一个二元动词,其中左侧参数是迭代次数,右侧参数是初始字符串。这使我可以轻松地扩展字符串。
fib0=: (,[:+/_2&{.)@]^:[
10 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89
11 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144
我可以通过填写 (,[:+/_2&{.)
来一元化地创建一个动词作为 ^:
的左参数和 10
作为左参数。虽然在扩展字符串时不太灵活。
fib1=: (,[:+/_2&{.)^: 10
fib1 0 1
0 1 1 2 3 5 8 13 21 34 55 89
最后,我通过附加 0 1
伪造了您可能正在寻找的结果。在定义中创建一个单子(monad)动词来寻找迭代次数。
fib2=: ((,[:+/_2&{.)@](^: [))& 0 1
fib2 10
0 1 1 2 3 5 8 13 21 34 55 89
fib2 11
0 1 1 2 3 5 8 13 21 34 55 89 144
但是您想知道是否有一种方法可以默认使用副词来做到这一点。采用我上面显示的内容,您可以从连词 ^:
中创建一个副词。通过添加动词 (,[:+/_2&{.)
向左。
afib=: (,[:+/_2&{.) ^:
(10 afib) NB. an adverb takes its left argument creating a conjunction.
(, ([: +/ _2&{.))^:10
(10 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89
(11 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144
关于j - 一种默认使用连词和副词的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49540177/