为啥在 Let while 循环里面不起作用 SML

Posted

技术标签:

【中文标题】为啥在 Let while 循环里面不起作用 SML【英文标题】:Why inside Let while loop does not work SML为什么在 Let while 循环里面不起作用 SML 【发布时间】:2021-07-11 14:31:58 【问题描述】:

我是标准 ML 的新手,我有一个问题,在下面的代码中 我在没有引入结构的情况下运行,代码运行并给出结果。当我放入引入结构时 它显示语法错误。谁能帮帮我?

fun findInd([],size, value , ans , l , h ) =  ~1
 |  findInd(lista ,size, value , ans , l , h) = 
 let 

    val midval = Real.round((real l + real h) / real 2) 
    val Nelem =  List.nth(lista,midval)

 in
    if l<=h then 
       if   Nelem <= value  then  findInd(lista,size,value,midval,midval+1,h )     
       else                       findInd(lista,size,value,ans,l,midval+(~1) ) 
   else
            ans 
 end;


let (* <-- this let gives the problem *)

    val s = 0
    val sum = ref s

    val maxlen = 0
    val maxlenptr = ref maxlen

    val counter_start = 0
    val counter = ref counter_start

    val arr = [1,5,~58,~1]
    val presum = [~53,~52,1,6]
    val minInd = [3,2,0,0

    while !counter < List.length(arr) do (
    sum := !sum + List.nth(arr,!counter);
    if !sum >=0 then  maxlenptr := !counter +  1 
    else
        let
        val ind = findInd(presum, List.length(arr) , s , ~1 ,0 , List.length(arr) + (~1) )
        val temp = List.nth(minInd,ind)
        in
        if ind <> ~1 andalso temp < counter_start then  maxlenptr := Int.max(!maxlenptr,counter_start + (~temp)) 
        else ()
        end;
        counter := !counter + 1
    );
    
        val m =  !maxlenptr
in (* <--- this in  *)
    m
end;

【问题讨论】:

@sepp2k 已经回答了这个问题,但在我看来,您正在使用大量程序代码对列表进行操作,这些列表是递归数据结构。我不确定代码应该实现什么,但让我感到震惊的是,可能有一种更简洁的方法更“实用”。 是的,你是对的!我正在尝试编写此实现的 ML 代码,上面的代码是我尝试的一部分 - geeksforgeeks.org/… 【参考方案1】:

let 的语法是let &lt;declarations&gt; in &lt;expression&gt;,while 循环不是声明。您需要在 in 之后移动它(就像您在另一个 lets 中对 ifs 所做的那样)。

【讨论】:

以上是关于为啥在 Let while 循环里面不起作用 SML的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 switch 语句在运行时会结束 while 循环?

for let 循环不起作用?

file_exists() 在 while 循环内的 php5 中不起作用

为啥多播不起作用?

Keil - 我的 while 循环不起作用

while 循环在 useEffect 挂钩中不起作用