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

SML编写返回'a * 'a元组列表的函数,模式匹配base case编译失败如何解决?

SML函数二元组列表返回值的基准用例正确写法

首先说明你三种写法报错的原因:

  • 第二种写法 fun myf [] = [()] 中,() 是SML的unit类型值,[()] 对应的类型是unit list,和你预期的('a * 'a) list(二元组列表)类型完全不匹配,因此触发编译报错。
  • 第三种写法 fun myf [] = [(NONE, NONE)] 中,NONE 是'a option类型的构造器,最终得到的是('a option * 'b option) list类型的值,和你需要的无option包装的普通类型二元组列表类型不符,也会导致编译失败。
  • 第一种写法 fun myf [] = [] 本身语法没有问题,报错的核心原因是SML的类型推断器无法单独从空列表推断出你需要的是('a * 'a) list类型,尤其是在缺少显式类型标注、或者递归分支逻辑和预期类型不匹配的情况下,就会抛出类型不匹配错误。

正确写法

如果你的基准用例需要返回空的二元组列表,只需要添加显式类型标注即可解决类型推断歧义:

(* 给基准用例添加返回值类型标注的写法 *)
fun myf [] = [] : (int * int) list
  | myf (x::xs) = (x, x * 2) :: myf xs (* 此处替换为你自己的递归逻辑 *)

(* 给整个函数添加类型标注的写法,可读性更高 *)
val myf : int list -> (int * int) list = fn
    [] => []
  | (x::xs) => (x, x * 2) :: myf xs

如果你的业务逻辑要求基准用例返回非空的二元组列表,直接填充对应类型的二元组即可,比如返回默认值(0,0)作为基准用例的元素:

fun myf [] = [(0, 0)]
  | myf (x::xs) = (x, x + 1) :: myf xs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:36:03