将int与OCaml中的int列表配对

时间:2014-02-08 07:41:15

标签: ocaml

我正在使用OCaml编写一个函数,该函数接受一个int和int元素列表,并返回一对对象列表,其中每对的第一个元素是int元素,而该对的第二个元素是来自的元素。名单。例如,假设我有数字1和列表[10; 20;作为输入。我喜欢返回的函数[(1,10); (1,20); (1,30)]。我写了以下函数:

let rec f (lst : int list) (elm : int) : (int*int) list =  
  match lst with 
  | [] -> failwith "empty list" 
  | [x] -> [(x, elm)];;

我收到以下错误:

Characters 59-120:                                                              
Warning 8: this pattern-matching is not exhaustive.                             
Here is an example of a value that is not matched:                               
_::_::_ val f : int list -> int -> (int * int) list = <fun> 

我错过了什么?

3 个答案:

答案 0 :(得分:1)

您的模式匹配长度为0([])且长度为1([x])的列表。编译器告诉你列表可能有其他长度,所以你的模式可能是错误的(这是真的)。​​

我可能会注意到,将空列表作为参数并不是错误。以这种方式思考将使解决问题变得更加困难。如果你得到一个空列表,那么正确答案就是空列表。

答案 1 :(得分:1)

这是您的代码

let rec f (lst : int list) (elm : int) : (int*int) list =  
  match lst with 
  | [] -> failwith "empty list" 
  | [x] -> [(x, elm)]

match中,您列出了两种情况:[][x]

您的第一个案例是[],您的意思是empty,没问题。

你的第二个案例是[x],你想说的是什么意思?在OCaml中,它意味着a list with only one element

有多个元素的情况怎么样?

对于任何if elsematch with,您应该包含所有案例。

当你解决这个问题时,你很快就会发现你真的错过了更多的东西。


这是正确的代码:

let rec f e l  =  
  match l with 
  | [] -> []
  | x::[] -> [(e,x)]
  | x::tl -> (e,x)::(f e tl)

注意

  1. 上面的代码不是tail-recursive,你通常应该考虑一下,我会把它留给你。
  2. 如果您在文件中编写代码并编译文件
  3. ,则不需要;;
  4. 在大多数情况下你不需要声明类型,这是ocaml最好的东西之一。

答案 2 :(得分:1)

let rec f e  =  function
  | []    -> []
  | x::tl -> (e,x)::f e tl

或者

let f e = List.map (fun x -> (e,x))

测试

# f 1 [];;
- : (int * 'a) list = []
# f 1 [10;20;30];;
- : (int * int) list = [(1, 10); (1, 20); (1, 30)]