如何仅指定一次&.I来简化单目tacit fork定义F&.I G H&.I?
简化J语言中带Under的Tacit Fork
针对你提出的单目tacit fork F&.I G H&.I(F和H先通过&.I处理后再传入G),是否能简化为仅写一次&.I,分两种情况讨论:
1. 当G满足同态条件时,可用(F G H)&.I
如果动词G满足同态性质:I^:_1 (a G b) = (I^:_1 a) G (I^:_1 b)(即G在I的逆变换下保持运算逻辑),比如G是加法+、乘法*这类线性运算,且I是可逆线性变换(如*2),此时(F G H)&.I完全等价于你的原结构。
推导逻辑:
(F G H)&.I y = I^:_1 ( (F (I y)) G (H (I y)) )
根据同态条件,上式可转化为:
(I^:_1 (F (I y))) G (I^:_1 (H (I y))) = (F&.I y) G (H&.I y)
2. 当G不满足同态条件时,无更简洁的内置写法
如果G不满足上述同态性质,(F G H)&.I就和原结构不等价(因为I^:_1会作用在G的整体结果上,而非F、H各自的结果)。这种情况下:
- 你提到的
(F G&(I^:_1) H)@I确实等价,但确实不够简洁; - 原写法
F&.I G H&.I是最直观的内置表达,没有更短的内置动词组合能替代它且仅写一次&.I。
如果需要频繁使用这类结构,可以自定义一个副词来简化:
underFork =: 4 : '(x&.y) z (w&.y)'
使用示例:F underFork G H I,即可实现(F&.I) G (H&.I)的效果。
内容的提问来源于stack exchange,提问作者Jonathan Schaber
相关产品推荐
相关产品推荐

