将一个int与OCaml中的int列表配对
我正在使用OCaml编写一个函数,该函数接受一个int列表和一个int元素,并返回一个对列表,其中每对中的第一个元素是int元素,第二个元素是列表中的成员。例如,假设我有数字1和列表[10;20;30]作为输入。我喜欢返回函数[(1,10);(1,20);(1,30)]。我编写了以下函数:将一个int与OCaml中的int列表配对,ocaml,Ocaml,我正在使用OCaml编写一个函数,该函数接受一个int列表和一个int元素,并返回一个对列表,其中每对中的第一个元素是int元素,第二个元素是列表中的成员。例如,假设我有数字1和列表[10;20;30]作为输入。我喜欢返回函数[(1,10);(1,20);(1,30)]。我编写了以下函数: let rec f (lst : int list) (elm : int) : (int*int) list = match lst with | [] -> failwith "emp
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>
字符59-120:
警告8:此模式匹配并非详尽无遗。
以下是一个不匹配值的示例:
_::::val f:int list->int->(int*int)list=
我错过了什么 您的模式匹配长度为0(
[]
)和长度为1([x]
)的列表。编译器告诉您列表可能还有其他长度,因此您的模式可能是错误的(这是正确的)
我可能会注意到,获取一个空列表作为参数并不是一个错误。这样想会使回答这个问题更加困难。如果您得到一个空列表,正确的答案是一个空的配对列表。您的模式匹配长度为0(
[]
)和长度为1([x]
)的列表。编译器告诉您列表可能还有其他长度,因此您的模式可能是错误的(这是正确的)
我可能会注意到,获取一个空列表作为参数并不是一个错误。这样想会使回答这个问题更加困难。如果您得到一个空列表,正确的答案是一个空的配对列表。您的模式匹配长度为0(
[]
)和长度为1([x]
)的列表。编译器告诉您列表可能还有其他长度,因此您的模式可能是错误的(这是正确的)
我可能会注意到,获取一个空列表作为参数并不是一个错误。这样想会使回答这个问题更加困难。如果您得到一个空列表,正确的答案是一个空的配对列表。您的模式匹配长度为0(
[]
)和长度为1([x]
)的列表。编译器告诉您列表可能还有其他长度,因此您的模式可能是错误的(这是正确的)
我可能会注意到,获取一个空列表作为参数并不是一个错误。这样想会使回答这个问题更加困难。如果您得到一个空列表,正确的答案是一个空的配对列表。这是您的代码
let rec f (lst : int list) (elm : int) : (int*int) list =
match lst with
| [] -> failwith "empty list"
| [x] -> [(x, elm)]
在匹配中,您列出了两种情况:[]
和[x]
您的第一个案例是[]
,您的意思是为空
,没有问题
您的第二个案例是[x]
,您想表达什么意思?在OCaml中,它表示只有一个元素的列表
有多个元素的情况如何
对于任何,如果其他或与匹配,则应包括所有案例。
当你解决这个问题时,你很快就会发现你真的错过了更多的东西
以下是正确的代码:
let rec f e l =
match l with
| [] -> []
| x::[] -> [(e,x)]
| x::tl -> (e,x)::(f e tl)
注意
上面的代码不是<代码>尾递归< /代码>,你通常应该考虑一下,我会把它留给你。
您不需要代码>如果在文件中编写代码并编译文件
在大多数情况下,您不需要声明类型,这是ocaml最好的功能之一
这是你的密码
let rec f (lst : int list) (elm : int) : (int*int) list =
match lst with
| [] -> failwith "empty list"
| [x] -> [(x, elm)]
在匹配中,您列出了两种情况:[]
和[x]
您的第一个案例是[]
,您的意思是为空
,没有问题
您的第二个案例是[x]
,您想表达什么意思?在OCaml中,它表示只有一个元素的列表
有多个元素的情况如何
对于任何,如果其他或与匹配,则应包括所有案例。
当你解决这个问题时,你很快就会发现你真的错过了更多的东西
以下是正确的代码:
let rec f e l =
match l with
| [] -> []
| x::[] -> [(e,x)]
| x::tl -> (e,x)::(f e tl)
注意
上面的代码不是<代码>尾递归< /代码>,你通常应该考虑一下,我会把它留给你。
您不需要代码>如果在文件中编写代码并编译文件
在大多数情况下,您不需要声明类型,这是ocaml最好的功能之一
这是你的密码
let rec f (lst : int list) (elm : int) : (int*int) list =
match lst with
| [] -> failwith "empty list"
| [x] -> [(x, elm)]
在匹配中,您列出了两种情况:[]
和[x]
您的第一个案例是[]
,您的意思是为空
,没有问题
您的第二个案例是[x]
,您想表达什么意思?在OCaml中,它表示只有一个元素的列表
有多个元素的情况如何
对于任何,如果其他或与匹配,则应包括所有案例。
当你解决这个问题时,你很快就会发现你真的错过了更多的东西
以下是正确的代码:
let rec f e l =
match l with
| [] -> []
| x::[] -> [(e,x)]
| x::tl -> (e,x)::(f e tl)
注意
上面的代码不是<代码>尾递归< /代码>,你通常应该考虑一下,我会把它留给你。
您不需要代码>如果在文件中编写代码并编译文件
在大多数情况下,您不需要声明类型,这是ocaml最好的功能之一
这是你的密码
let rec f (lst : int list) (elm : int) : (int*int) list =
match lst with
| [] -> failwith "empty list"
| [x] -> [(x, elm)]
在匹配中,您列出了两种情况:[]
和[x]
您的第一个案例是[]
,您的意思是为空
,没有问题
您的第二个案例是[x]
,您想表达什么意思?在OCaml中,它表示只有一个元素的列表
有多个元素的情况如何?