Сопоставление с шаблоном Ocaml: почему это совпадение не используется? - PullRequest
0 голосов
/ 08 октября 2018

Я только что изобрел бесполезную функцию:

let rec f = fun x y-> 
    let tmp = f (x-1) y in (match tmp with | y->y|m->m);;

Почему m->m не используется совпадение?Почему y->y здесь на самом деле является подстановочным знаком, а не значением из параметра y?Я хочу сделать следующее:

let rec f = fun x y ->
    let tmp = f (x-1) y in if tmp=y then y else tmp;;

Почему не работает соответствующий шаблону?В ответ, пожалуйста, ответьте на вопрос, порекомендовав обязательный способ сделать это.Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Используйте when, чтобы преодолеть его.

let rec f = fun x y-> 
    let tmp = f (x-1) y in (match tmp with |_ when tmp = y->y|m->m);;
0 голосов
/ 08 октября 2018

y в match tmp with y -> y | m -> m является (новой) переменной.Таким образом, оно соответствует любому значению.

Попробуйте оценить это выражение:

(fun x -> match x with y -> y + 1 | w -> w + 2) 3;;

Результат равен 4: x связывается с 3 при применении функции;3 соответствует переменной y;и, наконец, подвыражение y + 1 оценивается как 4 в контексте [ x = 3; y = 3].

Подвыражение if tmp=y then y else tmp эквивалентно просто tmp.

Почему вы хотите создать паттернсовпадать с целым числом?Что ваша функция должна делать?

...