首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候给出比#.^:_1更可取的行为

什么时候给出比#.^:_1更可取的行为
EN

Stack Overflow用户
提问于 2014-05-14 17:38:38
回答 2查看 98关注 0票数 1

如果您给基的逆(#.^:_1)一个列表作为左参数,它将产生与反基(#:)相同的结果:

代码语言:javascript
复制
   24 60 (#.^:_1) 123456
17 36
   24 60 (#:) 123456
17 36

如果给反基(#:)一个单独的左参数,它会复制剩余(|),而不是基的逆(#.^:_1):

代码语言:javascript
复制
   8 #: 1234
2
   8 | 1234
2
   8 (#.^:_1) 1234
2 3 2 2

在什么情况下,反碱基的行为会优于倒碱基?你为什么不直接在那些地方用残余物?我觉得我一定是忽略了反基地行为的效用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 20:57:01

首先:J字典将#.^:_1定义为等同于#:,因此它们(大部分)是可互换的,这一点也就不足为奇了。特别是,他说

r&#:与r&#相反。“

这种理论等价性在实践中也得到了支持。如果使用超酷副词b.向J的实现查询其对b.的定义,您将得到:

代码语言:javascript
复制
   24 60 60&#. b._1
24 60 60&#:

在这里,我们可以看到,#.^:_1所做的只是推迟到#:。它们被定义为等价的,现在我们可以看到#.^:_1 --至少在非标量LHA的情况下--只是将其参数传递给#:

那么我们该如何解释你观察到的差异呢?事实证明,即使在纯J的大厅里,理论和实践也不一样。#:#.^:_1之间存在不一致性,至少在标量左参数的情况下,后者的行为优于前者。

我(和)认为,这种差异是一个缺陷:上面引用的字典指出了这两个dyad是等价的,但是当0-:#$r (即r是标量)时,这个断言是错误的。以r=.2为例:(r&#: -: r&#.^:_1) 1 2 3不存在。也就是说,如果字典的断言(上面引用)是正确的,那么该语句应该返回1 ( true ),但它实际上返回0 (false)。

但是,正如您所指出的,这是一个有用的错误。也就是说:我更希望修改#:的定义以匹配#.^:_1,而不是相反。但这是#.^:_1#:更方便的唯一一次。在所有其他情况下,它们是等价的,而且由于#:是一个原语,而#.^:_1是带有尾随_1的复合短语,前者更方便。

例如,当您的右参数是一个数字文字时,很容易在无意中将其附加到_1 in #.^:_1中,就像在2 2 2 2 #.^:_1 15 7 4 5中一样,这会引发一个错误(因为_1 15 7 4 5是一个单词,因此作为一个整体,它是^:的参数)。有解决这一问题的方法,但没有一种方法像使用#:那样方便或简单。

你可以反驳说,在大多数情况下,LHA将是标量。这是一个经验性的论点,它会因代码基而异,但我个人看到很多情况,如24 60 60 #: ...,我试图将时间戳分解为持续时间桶(小时、分钟、秒),或者(8#2)#: ...,在这种情况下,我尝试将字节爆炸成精确的8位向量(例如,8 #.^:_1 ...,它会将字节分解成尽可能多的比特,无论是8位、3位还是17位)。我进一步认为,在J社区中,这些都是常用的、可立即识别的成语,因此使用#:有助于清晰和团队沟通。

但是,尽管存在bug,最终#:#.^:_1被定义为等价的,所以您使用的是哪一个才是真正的品味问题。(你会问,为什么要定义#.^:_1呢?嗯,那是另一个故事。)

想看一些酷的东西吗?#.^:_1是如何实现标量LHA的魔力的?让我们直接问J!

代码语言:javascript
复制
   2&#. b._1
($&2@>:@(2&(<.@^.))@(1&>.)@(>./)@:|@, #: ]) :.(2&#.)

首先,注意到(到目前为止) #:的使用并不令人惊讶。#.^:_1所做的就是为#:计算适当的LHA。

其次,短语$&2@>:@(2&(<.@^.))@(1&>.)@(>./)@:|@,向您展示了J如何计算基(或基) x中表示y的(最大值)所需的数字数。它本身是一个有用的短语,因此我在我的个人实用程序库中保存了它的一个版本:

代码语言:javascript
复制
   ndr =: 10&$: :(>:@<.@^. (1 >. >./@:|@,))
   ndr 1 10 100 101             NB. Number Digits Required in [default] base 10
3
   16 ndr 1 10 100 101          NB. Number Digits Required in hexadecimal
2
票数 5
EN

Stack Overflow用户

发布于 2015-09-20 23:41:38

也许不是一个压倒性的应用,但是,

代码语言:javascript
复制
 (4 # 256) #: 8234092340238420938420394820394820349820349820349x

代码语言:javascript
复制
 256 #. inv (2^32x) | 8234092340238420938420394820394820349820349820349x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23661473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档