Я просто придумал бесполезную функцию:

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;;

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

-1
Han XIAO 8 Окт 2018 в 09:44

2 ответа

Лучший ответ

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

let rec f = fun x y-> 
    let tmp = f (x-1) y in (match tmp with |_ when tmp = y->y|m->m);;
-1
Han XIAO 8 Окт 2018 в 15:28

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.

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

3
tbrk 8 Окт 2018 в 06:56