代码之家  ›  专栏  ›  技术社区  ›  P Shved

在OCaml中将函数应用于已知参数列表时,如何避免警告?

  •  2
  • P Shved  · 技术社区  · 15 年前

    如何转换多个值 a , b , c a' , b' , c' x'=f(x)

    我尝试通过以下方式将函数应用于列表:

    let [a';b'] = List.map f [a;b] in ...
    

    但这也带来了警告:

    Warning P: this pattern-matching is not exhaustive.                                                                                                         
    Here is an example of a value that is not matched:                                                                                                          
    []
    

    有办法避免吗?

    3 回复  |  直到 15 年前
        1
  •  7
  •   zrr    15 年前

    您可以编写一些用于映射到统一元组的函数,例如:

    let map4 f (x,y,z,w) = (f x, f y, f z, f w)
    let map3 f (x,y,z) = (f x, f y, f z)
    let map2 f (x,y) = (f x, f y)
    

    然后你可以随时使用它们。

    let (x',y') = map2 f (x,y)
    
        2
  •  4
  •   Pascal Cuoq    15 年前

    match List.map f [a;b] with
      [a';b'] -> ...
    | _ -> assert false
    

    但仅此而已。

        3
  •  1
  •   winitzki    12 年前

    编译器正试图在这里帮助您。它告诉您,您正试图将未知列表分配给 [a';b'] [a;b] ,被重构到代码中的不同位置,因此您看不到它,并且函数 f 有时 返回不同的列表?那你会的 有时 [a';b'] 有一张错误的名单。编译器无法检查代码是否正确,因此发出警告。

     let (a', b', c') = ( f a, f b, f c);;
    

    写这篇文章不需要太多的工作,但是完全可以避免将来代码中的任何更改。