在列表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
       (* ... *)