你如何与负1模式匹配?

时间:2018-05-26 17:51:25

标签: ats

这与" the pattern is expected to be formed with a constructor (of datavtype)"失败,因为它匹配线性构造函数的特殊free()ing语法,而不是负号。

#include "share/atspre_staload.hats"
implement main0() =
        case ~1 of
        | ~1 => println!("ok")
        | _ => ()

这与" operator fixity cannot be resolved"失败。添加parens或创建二元运算符并没有帮助。

#include "share/atspre_staload.hats"
implement main0() =
        case ~1 of
        | -1 => println!("ok")
        | _ => ()

这失败了,因为case中的变量引入了一个新绑定,与绑定范围内的绑定无关:

#include "share/atspre_staload.hats"
implement main0() =
        let
                val negative_one = ~1
        in
                case ~2 of
                | negative_one => println!("unintend match")
                | _ => () // error: this pattern match clause is redundant
        end

这是我们最接近的吗?它的性能有多少呢?

#include "share/atspre_staload.hats"
implement main0() =
        let
                val negative_one = ~1
        in
                ifcase
                | negative_one = ~1 => println!("this works")
                | _ => ()
        end

1 个答案:

答案 0 :(得分:1)

在ATS中,〜1不被视为常数;它是一个函数应用程序:〜应用于1.您可以按如下方式定义否定1:

#define NEG1 %(~1) // not yet working // to be fixed

#define NEG1 %(0-1) // this one is currently working

然后你可以写:

case ~1 of
| 1 => ...
| NEG1 => ...

使用'ifcase'(而不是'case')应该同样有效。