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

问题描述 投票:0回答:1

你好,我是Smlnj的新手,我想修改一个输入,把它交给一个函数。我在修改输入时被卡住了。

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

我试过了,但不幸的是它没有工作。

fun maketuples [] = []
  | maketuples x::xs = (x, hd xs) @ makektuples (tl xs)
functional-programming sml smlnj ml
1个回答
2
投票

这里有几个问题。

  • 如果你把一个构造函数的模式匹配作为函数参数 你需要在它周围加上括号,这样才能按照你的要求进行解析,例如: x::xs 也就是 -> (x::xs)

  • 你在第二个子句(makektuples;额外的k)

  • 你在使用append (@)上 int * int 和a (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"
© www.soinside.com 2019 - 2024. All rights reserved.