【问题标题】:String Length with Scalars and Vectors in APLAPL 中带有标量和向量的字符串长度
【发布时间】:2020-05-29 23:44:06
【问题描述】:

我几周前才开始学习 APL,所以这听起来像是一个新手问题。

B 是一个字符串,在APL 术语中它可以是一个标量或一个向量。如果是标量,⍴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,所以这个问题并不意味着批评。我的问题是,找到字符串长度的最佳方法是什么?而且,如果有人能对这种看似不一致的情况有所了解,我们将不胜感激。

【问题讨论】:

  • 我不确定我的理解是否正确。 ⍴,B 显示字符数。
  • @CrazyMetal - 如果有超过 1 个,那就是真的,但如果你分配 B←'A',它被认为是一个标量,⍴B 返回 null。如果你使用我上面的小技巧,它会返回 1。
  • 我写了⍴,B。在我看来,这是查找字符串长度的标准方法。
  • 酷!这很好用。我想我忽略了逗号。

标签: apl


【解决方案1】:

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

⍴,B

【讨论】:

  • 谢谢,但它没有解决不一致的部分。您可以从连接的标量中获取向量,但不能通过删除元素来获取标量。我意识到它仍然是一个向量,但我不明白为什么。但是,我喜欢解决方案。它比我的解决方案要整洁得多。谢谢!
  • 删除一个元素意味着你改变了对象的大小,仅此而已。您不会通过更改大小来更改排名。我看一开始肯定很难掌握,但是一旦习惯了“数组思维”,就会觉得很自然;-)
  • 一个相关的观察:monadic take(对不起,ipad 键盘上没有 APL 字符!)将向量的第一个元素作为标量返回。恐怕这些天我与 APL 相去甚远,无法回忆起所引用的明显不一致的原因。
  • 你在使用 Dyalog 吗? monadic take there 的行为取决于迁移级别 quadML。并且有一个设置(对不起,现在旅行没有手动和 APL)它的行为类似于“第一个”功能......
  • 抱歉 MBaas 刚刚看到你的问题。我的主要 APL 经验是 IBM 大型机 APL2。
【解决方案2】:

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

      ⍴'foo'
3

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

正如 Pé de Leão 所建议的,您可以使用 , 函数来确保标量值变成数组,这就是为什么使用 ⍴, 无论其参数是标量还是数组都有效。

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

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多