j - 如何过滤J中的列表?

标签 j tacit-programming

我目前正在学习迷人的 J 编程语言,但我无法弄清楚的一件事是如何过滤列表。

假设我有任意列表 3 2 2 7 7 2 9我想删除 2s 但保持其他所有内容不变,即我的结果将是 3 7 7 9 .我到底该怎么做?

最佳答案

简短的回答

   2 (~: # ]) 3 2 2 7 7 2 9
3 7 7 9

长答案

我有你的答案,但在你应该熟悉一些细节之前。开始了。

单子(monad),二元

J中有两种类型的动词:单子(monad)和二元。前者只接受一个参数,后者接受两个参数。

例如,将唯一参数传递给一元动词 # ,称为 tally,计算列表中元素的数量:
   # 3 2 2 7 7 2 9
7

动词 # ,它接受两个参数(左和右),称为复制,它是二元的,用于从右列表中复制元素的次数与左列表中相应元素指定的次数相同(在也列出):
   0 0 0 3 0 0 0 # 3 2 2 7 7 2 9
7 7 7



J 中有一个 fork 的概念,它是一系列 3 个动词应用于他们的论点,二元或一元。

这是我在第一个片段中使用的一种 fork 的图表:
 x (F G H) y

      G
    /   \
   F     H
  / \   / \
 x   y x   y

它描述了动词应用于其论点的顺序。因此出现了这些应用:
   2 ~: 3 2 2 7 7 2 9
1 0 0 1 1 0 1
~: (not equal) 在本例中是二元的,并产生一个 bool 值列表,当参数不等于 2 时为真。 .这是 F根据图示应用。

下一个申请是H :
   2 ] 3 2 2 7 7 2 9
3 2 2 7 7 2 9
] (identity) 可以是 monad 或 dyad,但它总是返回传递给动词的右参数(有一个相反的动词,[ 它返回......是的,左参数!:)

到现在为止还挺好。 FH在应用程序相应地返回这些值之后:
1 0 0 1 1 0 1
3 2 2 7 7 2 9

唯一要执行的步骤是 G动词应用。

如前所述,动词 # ,它是二元的(接受两个参数),允许我们从右参数复制项目的次数与在左参数的相应位置中指定的一样多。因此:
   1 0 0 1 1 0 1 # 3 2 2 7 7 2 9
3 7 7 9

我们刚刚从 2 中过滤掉了列表。 s。

引用

这两个文档中描述了略有不同的 fork、hook 和其他原语(包括上面提到的):
  • A Brief J Reference (175 KB)
  • Easy-J. An Introduction to the World's most Remarkable Programming Language (302 KB)

  • 其他有用的信息来源是 Jsoftware sitetheir wiki以及互联网上的一些邮件列表文件。

    关于j - 如何过滤J中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2864835/

    相关文章:

    fibonacci - 获取函数结果列表,直到 result > x

    j - 强制数组而不是J中的矩阵“i”。

    f# - 是否可以在 F# 中编写默认函数

    apl - 在 APL 中检查每个相邻的列表对是否有序(默认编程)

    for-loop - J 编程初学者循环

    j - 如何将 J 中的相等值分组?

    j - J中exit(不是exit'')是什么意思?

    j - J 中是否实现了三次样条插值方法?

    javascript - lambda : rewriting to point free style

    tacit-programming - J 有哪些独特之处?