Я не уверен, что означает succ
в вашем примере, но это не шаблон, определенный в стандартной библиотеке F #. Используя только базовую функциональность, вам нужно использовать шаблон, который соответствует любому числу, а затем вычесть один (и добавить один в теле):
let rec plus x y =
match y with
| 0 -> x
| y -> 1 + (plus x (y - 1))
В F # (в отличие, например, от Пролога) вы не можете использовать свои собственные функции внутри шаблонов. Однако вы можете определить активных шаблонов , которые определяют, как разбить входные данные на различные случаи. Следующее принимает целое число и возвращает либо Zero
(для нуля), либо Succ y
для значения y + 1
:
let (|Zero|Succ|) n =
if n < 0 then failwith "Unexpected!"
if n = 0 then Zero else Succ(n - 1)
Затем вы можете написать код, который ближе к вашей исходной версии:
let rec plus x y =
match y with
| Zero -> x
| Succ y -> 1 + (plus x y)