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")))