在列表ocaml中插入元素
Insert element in list ocaml
我创建了一个在列表中插入一个元素的函数。
插入将在元素 i
等于 k
时发生。
列表是(int * string) list
的列表,喜欢[(1,"hi")...]
这个想法是创建一个新列表,其中每个迭代 hd
都附加在开头。
当找到 i
时,然后插入 k
并且函数停止。
这里的代码:
let rec insert k v list_ =
let rec support k v list _
match list_ with
| (i,value) when i = k -> (k,v) :: tl
| hd :: [] -> hd
| hd :: tl -> hd :: support k v tl in
let inserted = support k v list_
let () =
let k = [ (1,"ciao");(2,"Hola");(3,"Salut") ] in
insert 2 "Aufwidersen" k
我认为一切都很好,但编译器说:
5 | | hd :: [] -> hd
Error: This pattern matches values of type 'a list
but a pattern was expected which matches values of type 'b * 'c`
而且我不明白为什么,我觉得一切都还好。
问题出在这部分:
match list_ with
| (i,value) -> ...
当你写这个的时候,Ocaml 推断 list_
必须是一个元组,这是一个类型错误,因为它实际上是一个元组列表。
我不明白你到底想要什么插入功能,但典型的模式是有两种情况,一种用于空列表,一种用于非空列表。我个人更喜欢使用 if-then-else 而不是模式守卫,但如果你想使用模式守卫,那也应该有效。无论哪种方式,您当然希望涵盖空列表的情况。
match list_ with
| [] -> (* ... *)
| (i,value)::tl ->
if i = k then
(* ... *)
else
(* ... *)
我创建了一个在列表中插入一个元素的函数。
插入将在元素 i
等于 k
时发生。
列表是(int * string) list
的列表,喜欢[(1,"hi")...]
这个想法是创建一个新列表,其中每个迭代 hd
都附加在开头。
当找到 i
时,然后插入 k
并且函数停止。
这里的代码:
let rec insert k v list_ =
let rec support k v list _
match list_ with
| (i,value) when i = k -> (k,v) :: tl
| hd :: [] -> hd
| hd :: tl -> hd :: support k v tl in
let inserted = support k v list_
let () =
let k = [ (1,"ciao");(2,"Hola");(3,"Salut") ] in
insert 2 "Aufwidersen" k
我认为一切都很好,但编译器说:
5 | | hd :: [] -> hd
Error: This pattern matches values of type 'a list
but a pattern was expected which matches values of type 'b * 'c`
而且我不明白为什么,我觉得一切都还好。
问题出在这部分:
match list_ with
| (i,value) -> ...
当你写这个的时候,Ocaml 推断 list_
必须是一个元组,这是一个类型错误,因为它实际上是一个元组列表。
我不明白你到底想要什么插入功能,但典型的模式是有两种情况,一种用于空列表,一种用于非空列表。我个人更喜欢使用 if-then-else 而不是模式守卫,但如果你想使用模式守卫,那也应该有效。无论哪种方式,您当然希望涵盖空列表的情况。
match list_ with
| [] -> (* ... *)
| (i,value)::tl ->
if i = k then
(* ... *)
else
(* ... *)