默认编程的优点/缺点J
作为J中的初学者,我经常遇到默认的程序,它比较熟悉的显式形式似乎相当拜占庭式。默认编程的优点/缺点J
现在只是因为我觉得难解释并不意味着默认形式是不正确或错误的。很多时候,默认形式比显式形式短得多,因此更容易一次直观地看到所有形式。
给专家的问题:这些默契形式是否表达了更好的结构感,并且可能提炼出潜在的计算机制?还有其他好处吗?
我希望答案是肯定的,并适用于某些非简单的例子...
不是专家,但在隐性编码的最大的积极方面对我来说是1),这使得它编写程序编写程序要容易一些,而且2)我更容易掌握J方法来解决问题(这是用J编程的重要组成部分)。显式更像程序编程,特别是当我使用控制字时,如,while.
或select.
。
挑战在于:1)显式代码有时比默认的运行速度快,但这取决于任务和算法; 2)默认代码被解析,因为它被解析,这意味着有时候显式代码是因为您可以让代码等待仅在运行时定义的变量值。
默认编程通常更快,更高效,因为您可以准确地告诉J您想要做什么,而不是随着它沿着您的句子发现。但是作为一个喜欢暗中编程的人,我可以说默认编程鼓励你以J的方式考虑事情。
破坏结局并回答你的问题:是的,默认编程可以并确实传达关于结构的信息。从技术上讲,它强调的是,意思是高于一切,但许多在您遇到的不太重要的表达式(@: & &. ^:
仅举几例)中突出显示的运算符具有非常与结构相关的含义。
为什么它支付给写默契代码典型的例子是模幂的特殊代码,以保证有many more shortcuts like it沿:
ts =: 6!:2, 7!:[email protected]] NB. time and space
100 ts '2 (1e6&| @ ^) 8888x'
2.3356e_5 16640
100 ts '1e6 | 2^8888x'
0.00787232 8.496e6
,你会听到说,其他主要的事情是,当J看到一个明确的定义,它具有分析和EVAL它每一次它应用它:
NB. use rank 0 to apply the verb a large number of times
100 ts 'i (4 : ''x + y + x * y'')"0 i=.i.100 100' NB. naive
0.0136254 404096
100 ts 'i (+ + *)"0 i=.i.100 100' NB. tacit
0.00271868 265728
NB. J is spending the time difference reinterpreting the definition each time
100 ts 'i (4 : ''x (+ + *) y'')"0 i=.i.100 100'
0.0136336 273024
但由于这两个原因采取后座到j具有解决p的一个非常鲜明的风格理念roblems。没有,如果有^:
。没有循环,有排名。同样,在微积分中,f + g实际上是函数的逐点和,其中(f + g)(x)= f(x)+ g(x) —由于J已经非常擅长逐点阵列,为什么要在那里停下来呢?
正如Haskell这样的语言乐于将高阶函数组合在一起而不是“手动”将它们端到端地同步,J也是如此。语义,看看下面的例子:
-
h =: 3 : '(f y) + g y'
–h
是抓住它的参数y
,其插入f
和g
,结果漏斗成加法的功能。 -
h =: f + g
–h
是功能f
和g
的总和。 -
(A < B) +. (A = B)
–“A小于B或A等于B.” -
A (< +. =) B
–“A小于或等于B.”
它有更多的代数。我迄今只谈过列车,关于^:
或&.
等工具的便利性有很多要说的。但是,这个教训是相当清楚的:J希望它能够以代数方式谈论你的功能。如果您必须将所有操作都包含在3 :''
或4 :''
—或更糟糕的情况下,请将其命名为单独的行! —每次要有趣的应用它们的时间(如通过/
或^:
或;.
)你可能会非常从J.
当然,我承认你将很难再找到例子一样优雅,因为这些因为你的表情变得更复杂。默契的风格只是需要一些习惯。词汇必须熟悉(如果不是第二性质)给你,即使这样,有时候你也很高兴通过那些简直不可原谅的代码来抨击它。这可以发生在任何语言。
如果你持续一段时间,你会发现你以完全不同的方式思考问题。对我而言,那是当我意识到你使用的语言会影响你解决问题的能力。 – Eelvex