j - 一种默认使用连词和副词的方法?

标签 j tacit-programming

这是一个朴素的斐波那契数列:

   (,[:+/_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/

相关文章:

j - 将副词应用于动名词列表

j - 为什么两个相似的 J 动词短语可以起作用,但只有一个与动态强力连词一起起作用?

for-loop - J 编程初学者循环

tacit-programming - 如何在 J 中定义一个动词,将不同的动词交替应用于列表中的每个原子?

j - 在列表上组合加法和除法动词

j - 结果数字的精度

j - 需要帮助解析 "i.~"的含义

j - 如何重写J中的减半函数?

f# - 为什么这个无点 F# 函数的行为与非无点版本不同?

j - 为什么我得不到 J 中 Euler 56 的正确答案?