OCaml: соответствие любому негативу - PullRequest
5 голосов
/ 30 апреля 2010

Есть ли способ получить шаблон сопоставления моего значения с любым отрицательным числом? Неважно, что такое отрицательное число, мне просто нужно сопоставить с любым отрицательным.

Я достиг того, что хочу, с помощью этого простого кода:

let y = if(n < 0) then 0 else n in   
match y with  
0 -> []  
| _ -> [x] @ clone x (n - 1)

Но я хочу исключить этот оператор if и заставить его проверить его как другой случай в match утверждении

Ответы [ 3 ]

10 голосов
/ 30 апреля 2010

Да, используйте охрану:

match n with
    _ when n < 0 -> []
  | _ -> [x] @ clone x (n - 1)
9 голосов
/ 30 апреля 2010

Вы можете сделать свой код немного чище, как это:

match n < 0 with
| true -> []
| false -> [x] @ clone x (n - 1)

Еще лучше было бы:

if n < 0 then [] else [x] @ clone x (n - 1)

Как правило, если операторы более понятны, чем совпадения для простых логических тестов.

Пока мы это делаем, мы могли бы использовать :: вместо @:

if n < 0 then [] else x :: clone x (n - 1)
0 голосов
/ 30 апреля 2010

Есть ключевое слово когда. По голове (сейчас не могу проверить)

let y = соответствует n с | когда n <0 -> 0 | 0 -> [] | _ -> [x] @ clone x (n - 1)

Однако даже ваш пример не должен работать. Как с одной стороны, вы возвращаете int, а с другой - список.

...