1

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

function =: 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
4

2 回答 2

2

首先,3:0解析like (3:) (0),即单子“ 3:”应用于名词“ 0”。那不是你想要的;对于定义,您想使用对子“ :”,因此您需要将其3与空格分开。

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

可以简化几个部分:

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

功能与以前相同,但更清晰、更快捷。

于 2009-09-03T19:53:06.367 回答
0

我发现我得到了一个堆栈错误,而不是使用 monad 定义而不是使用 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
)

我最近的尝试是非常接近现在得到一个值错误。仍然不知道为什么它会失败,但我很快就会得到它。我发现我忘记了所需的操作。在条件添加它们之后修复一切。

于 2009-09-03T14:06:45.467 回答