首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Why3ML中的布尔模式匹配

Why3ML中的布尔模式匹配
EN

Stack Overflow用户
提问于 2017-11-17 17:13:13
回答 1查看 95关注 0票数 0

在其他ML-变体(如SML)中,可以这样做:

代码语言:javascript
复制
case l of
   (true, _) => false
 | (false,true) => false
 | (false,false) => true

但是,使用Why3ML match声明做类似的事情会引发语法错误:

代码语言:javascript
复制
match l with
 | (true, _) -> false
 | (false,true) -> false
 | (false,false) -> true
end

如何正确地在元组中进行基于值的模式匹配?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-23 11:15:11

是的,有可能:

代码语言:javascript
复制
module Test
  let unpack_demo () =
    let tup = (true, false) in (* parens required here! *)
    match tup with
    | True, False -> true  (* pattern must use bool's constructor tags *)
    | _           -> false
    end

  let ex2 () = match true, false with (* parens not required here *)
    | True, x      -> x
    | False, True  -> false
    | False, False -> true
    end
end
代码语言:javascript
复制
hayai[cygwin64][1155]:~/prog/why3$ why3 execute test.mlw Test.unpack_demo
Execution of Test.unpack_demo ():
     type: bool
   result: true
  globals:

hayai[cygwin64][1156]:~/prog/why3$ why3 execute test.mlw Test.ex2
Execution of Test.ex2 ():
     type: bool
   result: false
  globals:

与SML或OCaml相比,Why3的模式语言是相当基础的。在Why3中,模式中唯一允许的值是构造函数(甚至不允许整数常量),并且只有元组可以被解构。这就是为什么在上面的模式中使用TrueFalse的原因;它们实际上是bool的适当构造函数--truefalse是为了方便而存在的,但它们不能在模式中工作。参见语法参考中的图7.2,并查看pattern的定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47355974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档