给定一个列表,创建一个元组列表 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)
我们可以通过删除对 hd
和 tl
的调用,进一步清理函数参数
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"
您好,我是 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)
我们可以通过删除对 hd
和 tl
的调用,进一步清理函数参数
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"