你好,我是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)
这里有几个问题。
如果你把一个构造函数的模式匹配作为函数参数 你需要在它周围加上括号,这样才能按照你的要求进行解析,例如: 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)
我们可以再清理一下,去掉对以下的调用 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"