合并模式匹配案例时的语法错误

问题描述 投票:0回答:1

我编写了以下函数来计算两个列表的笛卡尔积。

let rec descartes a = function
| _ when a = [] -> []
| [] -> []
| t::q -> (List.map (function x -> t, x) a) @ (descartes q a) ;;

但是当我想简化功能时

let rec descartes a = function
| _ when a = [] | [] -> []
| t::q -> (List.map (function x -> t, x) a) @ (descartes q a) ;;

我收到语法错误。

ocaml
1个回答
1
投票

根据this,模式匹配的语法是:

pattern-matching ::=  [ | ] pattern  [when expr] ->  expr  { | pattern  [when
                          expr] ->  expr }

您可以找到pattern here的语法。因此,您可以看到when不是pattern的一部分,这说明了语法错误。

但是在任何情况下,您的代码都是多余的,一旦有了[] -> [],就不再需要_ when a = [] -> []。所以你可以简单地写:

let rec descartes a = function
    | [] -> []
    | t::q -> (List.map (function x -> t, x) a) @ (descartes q a) ;;
© www.soinside.com 2019 - 2024. All rights reserved.