Sml 如何在两个整数范围内进行嵌套for循环?
我想复制一个函数,比如-Sml 如何在两个整数范围内进行嵌套for循环?,sml,Sml,我想复制一个函数,比如- for i in range(10): for j in range(10): do something with i, j 在SML中有没有一种简单的方法可以做到这一点 < P>你当然可以做到这一点,但是你应该考虑你是否真的想用I,J< /Cord>做一些事情,然后放弃结果。这是固有的命令式逻辑,而不是真正惯用的标准ML 但如果这真的是你想要的,那么有几种方法。这里有一个重要的问题: let val i = ref 0 in while
for i in range(10):
for j in range(10):
do something with i, j
在SML中有没有一种简单的方法可以做到这一点 < P>你当然可以做到这一点,但是你应该考虑你是否真的想<代码>用I,J< /Cord>做一些事情,然后放弃结果。这是固有的命令式逻辑,而不是真正惯用的标准ML 但如果这真的是你想要的,那么有几种方法。这里有一个重要的问题:
let val i = ref 0
in while !i < 10 do
( let val j = ref 0
in while !j < 10 do
( do something with i, j
; j := !j + 1
)
end
; i := !i + 1
)
end
这取决于你想做什么 你想为每个(i,j)产生副作用,比如打印一些东西吗
fun应用程序(n,f)=
放开乐趣i=如果i
应用(10,fn j=>
打印(“^show i^”和“^show j^”)\n)
还是要生成结果值?这个值是列表还是其他值
作为一个具体的例子,在这个问题上有一个问答。它询问如何将一段使用列表理解的Haskell代码移植到不支持列表理解的标准ML。你可以用Python 3做一个非常类似的例子;它的range()
函数不会生成列表,而是可以迭代的对象
然而,SML的List.tablate
实际上会生成一个列表,如果您打算在之后立即丢弃或过滤该列表,则会降低内存效率。我链接到的Q&A讨论了在三个整数范围的笛卡尔乘积上做一些事情(即寻找毕达哥拉斯三元组)的特定案例的可读性和效率
也许如果你举一个具体的例子,你会得到更好的回答。:-)
请随便用一个具体的例子来修改你的问题
let val range0To9 = List.tabulate (10, fn i => i)
in List.app range0To9 (fn i => List.app range0To9 (fn j => do something with i, j))
end
fun appulate (n, f) =
let fun go i = if i < n then (f i; go (i+1)) else ()
in go 0 end
val show = Int.toString
val _ = appulate (10, fn i =>
appulate (10, fn j =>
print ("(" ^ show i ^ ", " ^ show j ^ ")\n")))