我目前正在学习迷人的 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,但它总是返回传递给动词的右参数(有一个相反的动词,[
它返回......是的,左参数!:)到现在为止还挺好。
F
和 H
在应用程序相应地返回这些值之后: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 和其他原语(包括上面提到的):
其他有用的信息来源是 Jsoftware site与 their wiki以及互联网上的一些邮件列表文件。
关于j - 如何过滤J中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2864835/