2013-04-25 5 views
1

Мой вопрос прост: как я могу перевести этот код на Си:Выражение соответствия OCAML

if (x == y + 1) 
    // some code 
else if (x == y - 1) 
    // some code 
else if (x == y + 2) 
    .... 

В основном я думал об использовании сопоставления с образцом, который, казалось бы уместно. К сожалению, картина, как это не работает:

match x with 
| y + 1 -> some code 
| y - 1 -> some code 
| y + 2 -> some code 
| _ -> some code 

Компилятор не кажется, чтобы быть счастливым и от того, что я обнаружил, выражения на согласование pattenr как я не допускается. Поэтому я попытался положить их в значениях таким образом:

let v1 = y + 1 in 
let v2 = y - 1 in 
let v3 = y + 2 in 
match x with 
| v1 -> some code 
| v2 -> some code 
| v3 -> some code 
| _ -> some code 

Unfortunatly Я получаю предупреждения о том, что мои значения v1 v2 и v3 не используются и что случаи совпадения, которые используют их не используются слишком.

Как правильно сопоставить выражение с другими выражениями?

Благодаря

ответ

2

На самом деле, ваш код C почти правильный код OCaml.

if x = y + 1 then 
    (* some code *) 
else if x = y - 1 then 
    (* some code *) 
else if x = y + 2 then 
    .... 

соответствие шаблону не является заменой для if then, то есть укомплектовать разные цели. OCaml позволяет создавать такие типы, как type 'a option = None | Some of 'a, и сопоставление образцов должно использоваться для деконструирования этих типов. Он не может использоваться для других целей.

+0

Я понимаю, что вы пытаетесь сказать, но быть педантичным, сопоставление с образцом _is_ замену 'if', в том смысле, что если' 'просто удобный синтаксический сахар для двухстороннего совпадения над булевым. –

1

Thomash is right, этот код естественно выражается if выражениями в OCaml, а не шаблонами. Причина, по которой ваши примеры не работают, состоит в том, что шаблоны состоят из констант и вновь заданных переменных. Если в шаблоне появляется переменная (имя), она становится вновь определенным именем, значение которого является соответствующей частью выражения соответствия. Любое предыдущее определение имени не имеет значения внутри матча.

Если вы абсолютно пришлось использовать match, можно написать следующим образом:

match y - x with 
| -1 -> (* some code *) 
| 0 -> (* some code *) 
| 1 -> (* some code *) 
| 2 -> (* some code *) 
| _ -> (* some code *) 

Но я с Thomash, я думаю, что if выражения будет лучше.

2

Если вы настаиваете на использовании match вы можете использовать

match x with 
| z when z=y+1 -> ... 
| z when z=y-1 -> ... 

 Смежные вопросы

  • Нет связанных вопросов^_^