将一个int与OCaml中的int列表配对

将一个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

我正在使用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 "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中,它表示只有一个元素的列表

    有多个元素的情况如何?