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
相关产品推荐
相关产品推荐

