APL中带有标量和向量的字符串长度

时间:2013-06-25 12:05:23

标签: apl

几周前我刚刚开始学习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,所以这个问题不是批评。我的问题是,找到字符串长度的最佳方法是什么?而且,如果有人能够对这种看似不一致的事情略微说清楚,那将是值得赞赏的。

2 个答案:

答案 0 :(得分:5)

连接X并删除它的原因是,连接产生一个向量。使用1↓删除X然后将其作为向量,作为精确的空向量。矢量长度可以用measured测量。这也是CrazyMetal的解决方案所做的:monadic ,将其参数(任何维度的标量或数组)转换为向量。并测量它的rho为您提供了您正在寻找的答案: 标准方法来查找字符串长度。

⍴,B

答案 1 :(得分:2)

您看到的行为是由APL语法的不一致引起的。用单引号括起来的字符序列会创建这些字符的数组。例如,'foo'会创建一个字符foo的数组。在此数组上调用会显示预期结果:

      ⍴'foo'
3

但是,这些是此规则的一个例外,这是语法不一致的地方。在单引号内指定单个字符时,不会创建单个字符的数组,而是返回字符本身。这就是⍴'f'返回空数组的原因,因为该值是标量。

正如PédeLeão所建议的那样,您可以使用,函数来确保标量值成为一个数组,这就是使用⍴,无论其参数是标量还是阵列。

由于这种不一致,GNU APL有一个扩展,允许您在键入字符串时使用"而不是'。它们之间的唯一区别是"总是创建一个数组,即使对于单个字符也是如此。