我正在使用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>
我错过了什么?
答案 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 else
或match with
,您应该包含所有案例。
当你解决这个问题时,你很快就会发现你真的错过了更多的东西。
这是正确的代码:
let rec f e l =
match l with
| [] -> []
| x::[] -> [(e,x)]
| x::tl -> (e,x)::(f e tl)
注意强>
tail-recursive
,你通常应该考虑一下,我会把它留给你。;;
答案 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)]