Как вы сравниваете шаблон с отрицательным 1?

Это не с "the pattern is expected to be formed with a constructor (of datavtype)", поскольку он соответствует специальному синтаксису free() для линейных конструкторов, а не отрицательному знаку.

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

Это не с "operator fixity cannot be resolvedMsgstr "Это не поможет добавить паренсы или сделать бинарный оператор.

#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 ответ

Решение

В САР ~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') должно быть одинаково эффективным.

Другие вопросы по тегам