`{??}` 和 `?` 有什么不同?

ssf*_*frr 6 arguments variadic-functions apl dyalog

我正在阅读 Hui 和 Kromberg 最近的“自 1978 年以来的 APL”,在?(模板)的讨论中,他们给出了以下示例:

      {??}?5?'abcde'
   abc   abcd  abcde  bcde   cde
Run Code Online (Sandbox Code Playgroud)

为什么{??}需要的只是??我对 APL 还是很陌生,但我天真地认为,一般来说{f?}应该等同于fmonadically 调用。

根据经验,我可以看到情况并非如此:

      ??5?'abcde'
DOMAIN ERROR
      ??5?'abcde'
      ?
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么。

Adá*_*dám 6

你是绝对正确的,{??}相当于单次?调用时,但是根据文档

f使用向量 left 参数二元调用,指示每个轴的填充元素数量和在哪一边;正值意味着填充在数组值之前,负值意味着填充在数组值之后。

我们可以通过让函数同时返回两个参数的外壳来说明这一点:

      {?? ?}?5?'abcde'
?????????????????????????????????????????????????????
?????????????????????????????????????????????????????
??2?  abc???1? abcd???0?abcde???¯1?bcde ???¯2?cde  ??
?????????????????????????????????????????????????????
?????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

此左参数旨在满足作为左参数的要求,?因此可以轻松删除添加的填充:

      {????}?5?'abcde'
?????????????????????????
?abc?abcd?abcde?bcde?cde?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)

如果你想要一个默认操作数而不是{??}then 你可以使用???(它等价于{????}and 因此{??})或者,在版本 18.0 中,???(它等价于{????}and 因此{??})。