You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用while循环实现生成1²到n²列表的SML函数报错求助

解决SML中while循环生成平方列表的类型冲突问题

错误根源

你碰到的类型冲突,核心是**::运算符的使用顺序搞反了**:

  • SML里::是用来构造列表的,正确语法是 单个元素 :: 已有列表,作用是把元素插到列表头部。
  • 你代码里的!squares::(!x * !x),是把列表!squares放左边,int类型的平方值放右边,这完全不符合::的类型要求(它要求右操作数必须是同类型的列表),所以才会报出“无法合并int和列表类型”的错误。

另外要注意:就算你修正了::的顺序,直接返回!squares得到的是倒序列表(因为每次往头部加元素,最终是[n², (n-1)², ..., 1²]),不符合需求,所以最后必须反转列表。

修正后的代码

(*listOfSquares - returns list of 1^2, 2^2 ... n^2*)
fun listOfSquares n =
    let 
        val x = ref 1 
        val squares = ref []
    in
        while !x <= n do (
            (* 修正::顺序:把当前平方值加到列表头部 *)
            squares := (!x * !x) :: !squares;
            x := !x + 1
        );
        (* 反转列表得到正序结果 *)
        rev (!squares)
    end;

额外说明

  • 要是你不想用rev,也可以用@往列表尾部追加,但得写成!squares @ [!x * !x](必须把单个元素包装成列表才能拼接),不过这种方式在n大的时候效率很低,因为@每次都要遍历整个列表,所以更推荐先头部添加再反转的方案。

内容的提问来源于stack exchange,提问作者Joshua White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:02:40