代码之家  ›  专栏  ›  技术社区  ›  zajer

在ocaml中同时匹配多个模式

  •  0
  • zajer  · 技术社区  · 1 年前

    具有如下自定义变体类型:

    type yolo = 
    | A of string
    | B of yolo
    | C of yolo * yolo
    | D of yolo * yolo
    

    我还有一个函数,它对的实例执行一些操作 yolo 类似于此:

    let rec swag y = 
      match y with
      | A _ -> 1
      | B _ -> 2
      | C (left,right) -> (swag left) + (swag right)
      | D (left,right) -> (swag left) + (swag right)
    

    由于案例的操作 C D 完全相同,我想合并它们,有可能吗?

    1 回复  |  直到 1 年前
        1
  •  4
  •   Jeffrey Scofield    1 年前

    像这样的图案 pat1 | pat2 匹配两种模式中的任何一种:

    let rec swag y = 
    match y with
    | A _ -> 1
    | B _ -> 2
    | C (left,right) | D (left,right) -> (swag left) + (swag right)
    

    自然,这两种模式必须将相同的名称(在本例中为左和右)与相同的类型绑定。

        2
  •  0
  •   Chris    1 年前

    杰弗里的回答很正确。您可能希望考虑,如果您有几个对相同信息进行编码的构造函数,那么构造函数的名称是否只是用作标志,其中您可以更直接地表示这种关系。例如。

    type flag = C | D
    
    type yolo = 
    | A of string
    | B of yolo
    | X of flag * yolo * yolo
    

    然后:

    let rec swag y = 
      match y with
      | A _ -> 1
      | B _ -> 2
      | X (_, left, right) -> swag left + swag right
    

    您也可以使用 function 此处的关键字。

    let rec swag = function 
      | A _ -> 1
      | B _ -> 2
      | X (_, left, right) -> swag left + swag right