给定gerund如何计算f1(f2(... fn(x)...))

时间:2019-12-13 09:29:57

标签: j

一个人可以将f1(f2(f3(x)))计算为

*: +: >: 4                 NB. 100

给出长度为“未知”(例如m1 =: *:`+:`>:m2 =: +:`>:的gerund),如何计算f1(f2(...(fn(x)) ...))

到目前为止,我只能使用m `: 0evoke

(*:`+:`>: `: 0) 4         NB. 16 8 5

2 个答案:

答案 0 :(得分:4)

让:

   NB. an example gerund
   ] g=: *:`<:`+:`>:
┌──┬──┬──┬──┐
│*:│<:│+:│>:│
└──┴──┴──┴──┘
   NB. a sentence to evoke
   *: <: +: >: 4
81

第一种方法(通过动态编程)

1A。组成整个句子然后唤起它

将gerund中的所有元素转换为线性表示(LR),组成句子,然后将其唤起:

   NB. utility to find out a LR from an atomic
   NB. representation (AR) and parenthesize it
   NB. pLR=. plr AR
   plr=: 3 : 0
v=. y 5!:0
'(' , (5!:5 < 'v') , ') '
)
   NB. result=. gerund v1 input
   v1=: 4 : '". (; <@plr"0 x) , ": y'
   NB. evoke v1 with a gerund and input applied
   g v1 4
81

优点:否

缺点:

  1. 由于格式(":)可能会截断
  2. ,因此输入数据类型应准确(浮点数或复数形式)
  3. 应用于输入的动词只能是单子词

1B。顺序唤起成分动词

从gerund中获取当前元素,将其转换为动词,将该动词应用于累加器,对gerund中的下一个元素重复:

   NB. result=. gerund v2 input
   v2=: >@(4 : '(x 5!:0)&.> y'/)@(, <)
   NB. evoke v2 with a gerund and input applied
   g v2 4
81

优点:

  1. 允许输入任何数据类型

缺点:

  1. 应用于输入的动词只能是单子词

第二种方法(实用)

2A。将gerund转换为fork

   NB. a fork we are going to compose, in action
   ([: *: [: <: [: +: >:) 4
81
   NB. its structure
   ([: *: [: <: [: +: >:)
┌──┬──┬──────────────────┐
│[:│*:│┌──┬──┬──────────┐│
│  │  ││[:│<:│┌──┬──┬──┐││
│  │  ││  │  ││[:│+:│>:│││
│  │  ││  │  │└──┴──┴──┘││
│  │  │└──┴──┴──────────┘│
└──┴──┴──────────────────┘
   NB. how to compose it
   ('[:' ; g)@.0 1 0 2 0 3 4
┌──┬──┬──────────────────┐
│[:│*:│┌──┬──┬──────────┐│
│  │  ││[:│<:│┌──┬──┬──┐││
│  │  ││  │  ││[:│+:│>:│││
│  │  ││  │  │└──┴──┴──┘││
│  │  │└──┴──┴──────────┘│
└──┴──┴──────────────────┘
   NB. selector (ISO generator)
   NB. iso=. sel gerund
   sel=: (< < < _2) { (0 ,@,. #\)
   NB. let's test it
   sel g
0 1 0 2 0 3 4
   NB. sentence to assemble a fork
   ('[:' ; g)@.(sel g)
┌──┬──┬──────────────────┐
│[:│*:│┌──┬──┬──────────┐│
│  │  ││[:│<:│┌──┬──┬──┐││
│  │  ││  │  ││[:│+:│>:│││
│  │  ││  │  │└──┴──┴──┘││
│  │  │└──┴──┴──────────┘│
└──┴──┴──────────────────┘
   NB. an adverb executing that sentence
   NB. fork=. gerund a2a
   a2a=: 1 : '(''[:'' ; m)@.(sel m)'
   NB. evoke that adverb to transform a gerund to a fork
   g a2a
┌──┬──┬──────────────────┐
│[:│*:│┌──┬──┬──────────┐│
│  │  ││[:│<:│┌──┬──┬──┐││
│  │  ││  │  ││[:│+:│>:│││
│  │  ││  │  │└──┴──┴──┘││
│  │  │└──┴──┴──────────┘│
└──┴──┴──────────────────┘
   NB. apply a fork produced to input
   g a2a 4
81

优点:

  1. 允许输入任何数据类型
  2. 应用于输入的动词可以是任意价(单价,二价或矛盾价)

缺点:否

2B。将gerund转换为输送机

以某种方式通过At(@:)连接成分动词。产生的动词将是At-chained组成动词序列。

2B1。通过arconj实用程序

加入成分动词以构成AR,然后通过Define(5!:0)将AR转换为动词。

   NB. a chain we are going to compose, in action
   *:@:<:@:+:@:>: 4
81
   NB. its structure
   *:@:<:@:+:@:>:
┌──────────────────┬──┬──┐
│┌──────────┬──┬──┐│@:│>:│
││┌──┬──┬──┐│@:│+:││  │  │
│││*:│@:│<:││  │  ││  │  │
││└──┴──┴──┘│  │  ││  │  │
│└──────────┴──┴──┘│  │  │
└──────────────────┴──┴──┘
   NB. its AR
   chain=. *:@:<:@:+:@:>:
   5!:1 < 'chain'
┌────────────────────────────────┐
│┌──┬───────────────────────────┐│
││@:│┌──────────────────────┬──┐││
││  ││┌──┬─────────────────┐│>:│││
││  │││@:│┌────────────┬──┐││  │││
││  │││  ││┌──┬───────┐│+:│││  │││
││  │││  │││@:│┌──┬──┐││  │││  │││
││  │││  │││  ││*:│<:│││  │││  │││
││  │││  │││  │└──┴──┘││  │││  │││
││  │││  ││└──┴───────┘│  │││  │││
││  │││  │└────────────┴──┘││  │││
││  ││└──┴─────────────────┘│  │││
││  │└──────────────────────┴──┘││
│└──┴───────────────────────────┘│
└────────────────────────────────┘
   NB. we'll compose it with AR utility (arconj) from addon
   load 'misc/miscutils/langexten'
   NB. an adverb assembling a chain
   NB. chain=. gerund a2b1a
   a2b1a=: 1 : '(''@:'' arconj~/ |. m) 5!:0'
   NB. evoke that adverb to transform a gerund to chain
   g a2b1a
┌──────────────────┬──┬──┐
│┌──────────┬──┬──┐│@:│>:│
││┌──┬──┬──┐│@:│+:││  │  │
│││*:│@:│<:││  │  ││  │  │
││└──┴──┴──┘│  │  ││  │  │
│└──────────┴──┴──┘│  │  │
└──────────────────┴──┴──┘
   NB. apply a chain produced to input
   g a2b1a 4
81

优点:

  1. 允许输入任何数据类型
  2. 应用于输入的动词可以是任意价(单价,二价或矛盾价)

缺点:否

注意:

  1. a2b1a可以简化为一条结构稍有不同但功能相同的链:

    a2b1b=: 1 : '(''@:'' arconj/ m) 5!:0'
    
  2. arconj实用程序可以手动重新实现为[1]:

    arconj2=: (<'@:') ,@<@, <@,
    a2b1c=: 1 : '({. arconj2/ m) 5!:0'
    

    或作为[1]:

    arconj3=: 4 : '(x`:6)@(y`:6)`'''''
    a2b1d=: 1 : '({. arconj3/ m) 5!:0'
    

2B2。通过火车(`:6

加入成分动词,然后应用Train(`:6)[2]。

   NB. a chain we are going to compose, in action
   *:@:<:@:+:@:>: 4
81
   NB. its structure
   *:@:<:@:+:@:>:
┌──────────────────┬──┬──┐
│┌──────────┬──┬──┐│@:│>:│
││┌──┬──┬──┐│@:│+:││  │  │
│││*:│@:│<:││  │  ││  │  │
││└──┴──┴──┘│  │  ││  │  │
│└──────────┴──┴──┘│  │  │
└──────────────────┴──┴──┘
   NB. an adverb assembling a chain
   NB. chain=. gerund a2b2
   a2b2=: 1 : '(}: , m ,. <''@:'')`:6'
   NB. evoke that adverb to transform a gerund to chain
   g a2b2
┌──────────────────┬──┬──┐
│┌──────────┬──┬──┐│@:│>:│
││┌──┬──┬──┐│@:│+:││  │  │
│││*:│@:│<:││  │  ││  │  │
││└──┴──┴──┘│  │  ││  │  │
│└──────────┴──┴──┘│  │  │
└──────────────────┴──┴──┘
   NB. apply a chain produced to input
   g a2b2 4
81

优点:

  1. 允许输入任何数据类型
  2. 应用于输入的动词可以是任意价(单价,二价或矛盾价)
  3. 最简单的版本

缺点:否

注释

J Forums是询问您是否希望更快获得答案的最佳位置。

参考

[1]:[Jprogramming] Gerund composed application 作者:劳尔·米勒(Raul Miller),2017年9月25日

[2]:System/Interpreter/Requests#verb pipelines,Dan Bron,2007年12月21日

答案 1 :(得分:1)

此解决方案不是很好,但是可以。

首先使用外来连接定义(5!:0)副词和原子表示(5!:1)将gerund转换为字符串形式,然后使用Raze(;)取消装箱。

然后使用默认格式(":)将y参数转换为字符串,并在空格前加上空格以为gerund字符串留空。

使用Append(,)创建一个字符串,并将Do(".)应用于该字符串以得到结果。

g=: 4 : 0
s=: ; (5!:1 <'t'[t=.x) 5!:0  NB. changes gerunds to string
a=:' ' , ": y                NB. makes argument into a string prefixed by blank
". s,a
)

或一行

g1=: 4 : ' ". (; (5!:1 <''t''[t=.x) 5!:0 ), '' '' , ": y'

   *:` +:` >: g 4
100
   *:` +:` >: g1 4
100