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

Given a list create a list of tuples 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 上使用追加 (@)。这个函数的域实际上是 'a list * 'a list,即它的两个参数必须是相同类型的列表。

我们可以这样修改:

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

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

更干净
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"