我正在尝试学习J和我正在使用的书说这是定义monadic函数的正确方法
function =: 3:0 function statements
所以我按照这种格式编写了折叠代码。你能告诉我为什么当我尝试用输入调用它时会抛出语法错误但是如果我只是调用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
答案 0 :(得分:2)
首先,3:0
解析(3:) (0)
,即应用于名词“3:
”的monad“0
”。那不是你想要的;对于定义,您希望使用二进制“:
”,因此您需要将其与3
分隔开来。
其次,您应该在定义中使用=.
而不是=:
,因为t
和a
是局部变量。
可以简化几个部分:
d =: 0 = h | [ NB. does h y divide y
p =: d # h NB. select d y from h y
与以前相同的功能,但更清晰,更快。
答案 1 :(得分:0)
我想通过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
)
我最近的尝试是一个很好的交易现在接近一个值错误。仍然不确定为什么它失败但我很快就会得到它。我想通了,我忘记了必要的事情。在条件添加它们之后修复了所有内容。