Functional programming 为什么这个J函数没有运行?

Functional programming 为什么这个J函数没有运行?,functional-programming,syntax-error,j,tacit-programming,Functional Programming,Syntax Error,J,Tacit Programming,我试图学习J,我正在使用的书说这是定义一元函数的正确方法 function =: 3:0 function statements 函数=:3:0 函数语句 所以我按照这种格式编写了折叠代码。你能告诉我为什么当我试图用输入调用它时会抛出语法错误,但如果我只调用p,它会返回3吗 h=:>:@i.@<.@-: :[: NB. gets all integers less than half of the input :[: forces error if used dyadicl

我试图学习J,我正在使用的书说这是定义一元函数的正确方法

function =: 3:0 function statements 函数=:3:0 函数语句 所以我按照这种格式编写了折叠代码。你能告诉我为什么当我试图用输入调用它时会抛出语法错误,但如果我只调用p,它会返回3吗

h=:>:@i.@<.@-: :[: NB. gets all integers less than half of the input :[: forces error if used dyadicly
d=:(0&=|)~ h :[: NB. gets list where if one is set that index from h was a factor of the input y  :[: forces error if used dyadicly
p=: 3:0 NB. tells us p is a monadic function
   t =: d y 
   a =: i. 1
   while. 1<#t
      if. t~:0
         a =: a, #t
      end.
      t=: _1 }. t NB. found first mistake wrong bracket but fixing that doesn't fix it
   end.
   a*1
) 

NB. p gets a list of all integers that are factors of y
p 4
| syntax error
| p 4
p
3
NB. h and d run fine
h 4
    1 2
h 7
    1 2 3
d 7
    1 0 0
d 4
    1 1

h=:>:@i.@我发现了一个堆栈错误,而不是使用monad define的语法错误,而不是使用3:0。我仍然需要解决一些问题,但我正在取得进展

h =:>:@i.@<.@-:
d =:(0&=@|)~ h
p =: monad define
t =: d y 
a =: i.0
while. 1<#t do.
   if. {:t~:0 do.
      a=:a, #t
   end.
   t=: _1 }. t 
end.
a
)

h=:>:@i.@首先,
3:0
类似于
(3:)(0)
,即单子“
3:
”应用于名词“
0
”。那不是你想要的;对于定义,您希望使用二元“
”,因此需要用空格将其与
3
分开

其次,您应该在定义中使用
=。
而不是
=:
,因为
t
a
是局部变量

可以简化几个部分:

d =: 0 = h | [             NB. does h y divide y
p =: d # h                 NB. select d y from h y

功能与以前一样,但更清晰、更快。

啊,谢谢你,我对函数式编程还不熟悉,对J来说也很陌生。我花了足够长的时间才想出一些我想要的东西,我想有一种更快的方法。[monad是自单子右键?J支持“函数级编程”,但不支持“函数式编程”。在单子上下文中,
[
是一个标识函数(返回参数)。在二元上下文中,它产生
x
,忽略
y
(返回左参数)。我在这里给出的定义利用钩子和叉子将动词组合成新动词。J不是函数式编程语言。它是函数级编程语言。(有关区别的讨论,请参阅Wikipedia关于函数级编程的文章。)