【问题标题】:A way to use conjunctions and adverbs tacitly?一种默契使用连词和副词的方法?
【发布时间】:2018-09-07 11:21:51
【问题描述】:

这是一个简单的斐波那契数列:

   (,[:+/_2&{.)^:10]0 1      NB. 10 + 2 elements
0 1 1 2 3 5 8 13 21 34 55 89

这是它的显式一元版本:

   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 问题的材料)告诉我,我应该去黑暗的一面学习更多关于动名词和` / `: 连词的知识。那是对的吗?如果是这样,我将不胜感激任何关于这个问题的新手友好材料:)

【问题讨论】:

    标签: j tacit-programming


    【解决方案1】:

    我认为我的自然方法是创建一个二元动词,其中左侧参数是迭代次数,右侧参数是初始字符串。这使我可以轻松地扩展字符串。

    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 并创建一个单元动词来查找迭代次数来伪造您可能正在寻找的结果。

      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
    

    【讨论】:

    • ((,[:+/_2&{.)@](^:(2-~[)))&1 1]10... 这很有趣。我明白了主要思想,需要阅读修饰符如何工作以完全理解所有细节。感谢您的回答!
    • 啊,现在说得通了。我对您对[ 的使用感到困惑,但后来注意到最右边的参数已经与& 绑定。 (...)@] 组合也很有教育意义。副词派生取最左边操作数的动词,与任一侧的一个操作数连词派生副词,与两个操作数连词派生动词。不错。
    猜你喜欢
    • 2014-12-28
    • 2015-05-24
    • 2015-11-26
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多