SML / NJ while循环

时间:2011-09-25 19:48:50

标签: while-loop sml smlnj

我是SML的新手,我无法弄清楚如何获得相同的答案;

它类似于:3 ^ 4< 32但是3 ^ 5> 32所以我的答案是4(3的幂),同样如果我有数字4和63然后4 ^ 2< 63但是4 ^ 3> 63所以我的答案是2(4的幂)。

我已经提出以下代码

val log (b, n) =
    let
        val counter = ref b
        val value = 0
    in
        while !counter > n do 
        ( counter := !counter*b 
          value := !value + 1)
    end;

所以这里的价值就是我的答案,但是我得到了很多错误。我知道我在很多地方都错了。任何帮助将不胜感激。

我也许可以用普通的ML方式做这件事,但我也想学习不纯的ML ......

fun loghelper(x,n,b) = if x>n then 0 else (1+loghelper((x*b),n,b)); 
fun log(b,n) = loghelper(b,n,b);

好的,所以最后这里是while循环的正确代码,它也可以正常工作;

      fun log (b, n) =
            let
               val counter = ref b
               val value = ref 0
            in
               while (!counter <= n) do 
               (counter := !counter*b; 
                value := !value + 1);
               !value
            end;

1 个答案:

答案 0 :(得分:3)

您的代码中有几个问题:

错误:

  • 而不是val log (b, n) =,它应该是fun log (b, n) =fun是一种便捷语法,可让您轻松定义函数。如果你想用val写这个,你会写:val log = fn (b, n) =>(在递归函数或带有多个curried参数的函数的情况下会变得更复杂)
  • 您需要一个分号来分隔两个命令性语句:( counter := !counter*b; value := !value + 1)
  • value必须是refval value = ref 0

逻辑:

  • 您的功能不会返回任何内容。 while循环具有单位类型,因此函数返回()(单位)。您可能想要返回!value。为此,您需要在整个while循环事件之后添加分号,然后编写!value
  • 你的while循环条件并没有多大意义。这似乎是逆转的。您可能想要while !counter <= n do
  • 您的基本情况不对。 value应该从1开始(因为counterb开始,bb到第一个权力);或counter应从1开始(从b到第0次幂为1)。您的功能版本也存在同样的问题。