我编写了以下函数来计算两个列表的笛卡尔积。
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) ;;
我收到语法错误。
根据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) ;;