几周前我刚刚开始学习APL,所以这听起来像是一个新手问题。
让B
成为一个字符串,在APL术语中可以是scalor或vector。如果它是标量,⍴B
将返回null而不是字符串的长度。
B←'QR'
⍴B ⍝ returns 2
B←'Q'
⍴B ⍝ returns null
我发现了一种方法:
⍴1↓'X',B ⍝ concatenating X and then removing it returns a value of 1
这有效,但看起来有点蠢,所以我想知道是否有更标准的方法来查找字符串长度。
这只是我还是看起来有点不一致?我读过的教程说将标量看作类似于向量代数的方式。但是如何将标量连接到标量会产生向量,但是从向量中删除标量永远不会产生标量?
我真的很享受APL,所以这个问题不是批评。我的问题是,找到字符串长度的最佳方法是什么?而且,如果有人能够对这种看似不一致的事情略微说清楚,那将是值得赞赏的。
答案 0 :(得分:5)
连接X并删除它的原因是,连接产生一个向量。使用1↓
删除X然后将其作为向量,作为精确的空向量。矢量长度可以用measured测量。这也是CrazyMetal的解决方案所做的:monadic ,
将其参数(任何维度的标量或数组)转换为向量。并测量它的rho为您提供了您正在寻找的答案: 标准方法来查找字符串长度。
⍴,B
答案 1 :(得分:2)
您看到的行为是由APL语法的不一致引起的。用单引号括起来的字符序列会创建这些字符的数组。例如,'foo'
会创建一个字符f
,o
和o
的数组。在此数组上调用⍴
会显示预期结果:
⍴'foo'
3
但是,这些是此规则的一个例外,这是语法不一致的地方。在单引号内指定单个字符时,不会创建单个字符的数组,而是返回字符本身。这就是⍴'f'
返回空数组的原因,因为该值是标量。
正如PédeLeão所建议的那样,您可以使用,
函数来确保标量值成为一个数组,这就是使用⍴,
无论其参数是标量还是阵列。
由于这种不一致,GNU APL有一个扩展,允许您在键入字符串时使用"
而不是'
。它们之间的唯一区别是"
总是创建一个数组,即使对于单个字符也是如此。