给定一个列表,创建一个元组列表SML



你好,我是Sml/nj的新手,我正在尝试修改一个输入,将其赋予一个函数。我一直在修改输入。

具体来说,我读取输入并将其存储在列表中。我想做一个函数,给定一个偶数长度的列表,它会生成一个新的列表,但带有2元素元组
例如,如果我的输入是列表[2, 7, 4, 6, 5, 8],我想创建此列表[(2, 7), (4, 6), (5, 8)]

我试过了,但不幸的是它不起作用:

fun maketuples [] = []
| maketuples x::xs = (x, hd xs) @ makektuples (tl xs)

这里有两件事:

  • 如果您将构造函数作为函数参数进行模式匹配,则需要在其周围加上括号,以便按您想要的方式进行解析,即x::xs->(x::xs)

  • 您在第二个子句(makektuples;额外k(中有拼写错误

  • 您在int * int(int * int) list上使用append(@(。这个函数的域实际上是'a list * 'a list,也就是说,它的两个参数必须是相同类型的列表。

我们可以这样修改:

fun maketuples [] = []
| maketuples (x::xs) = [(x, hd xs)] @ maketuples (tl xs)

但是单例追加并不是你真正应该做的事情。为什么?只使用缺点更清洁:

fun maketuples [] = []
| maketuples (x::xs) = (x, hd xs) :: maketuples (tl xs)

我们可以通过删除对hdtl的调用,只需进一步破坏函数参数,就可以进一步清理这些问题

fun maketuples [] = []
| maketuples (x::y::xs) = (x, y) :: maketuples xs

也许你可以更好地处理错误(一种可能性是有例外(:

fun maketuples [] = []
| maketuples (x::y::xs) = (x, y) :: maketuples xs
| maketuples _ = raise Fail "Not an even length list"

最新更新