Применяя функцию n раз - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь применить функцию к значению n раз.

В настоящее время у меня есть

let rec n_times (f, n, v) = 
 if n > 0 then
  n_times f n-1 (f v)
 else 
  v

По какой-то причине я продолжаю получать сообщение об ошибке

This expression has type 'a but an expression was expected of type 'a * int * 'b 
The type variable 'a occurs inside 'a * int * 'b

Я видел несколько сообщений, посвященных той же проблеме, что и я работает, но ни один из них не получает ту же ошибку.

Ответы [ 4 ]

2 голосов
/ 18 февраля 2020

В первой строке вашего кода: вы говорите: «Я объявляю функцию с именем n_times, которая принимает триплет (f, n, v) один аргумент», а затем на сайте вызова (третья строка) вы даете 3 аргумента.

Чтобы исправить это: напишите let rec n_times f n v = в строке 1 или n_times (f, n-1, (f v)) в строке 3.

0 голосов
/ 18 февраля 2020

Кажется, есть недоразумение в том, как определены функции OCaml с несколькими аргументами. Вам следует заменить

let rec n_times (f, n, v) =

на:

let rec n_times f n v =
0 голосов
/ 18 февраля 2020

Есть, по крайней мере, две проблемы, это помогло бы узнать, какова цель, кроме рекурсии.

Чтобы запустить его, вам нужно изменить третью строку. n_times определяется с тремя входами, поэтому его нужно вызывать с тремя. Также определена функция, позволяющая принимать общий, целочисленный и общий ввод и выводить общий тип.

Вы можете удалить (f v) и ввести только v каждый l oop,

# let rec n_times (f, n, v) =
    if n > 0 then
        n_times (f , n-1 , v)
    else
      v;;
val n_times : 'a * int * 'b -> 'b = <fun>
# n_times(2,3,4);;
- : int = 4

Однако это всегда будет возвращать только v в конце.

Вы также можете заменить (f v) списком и добавлять в него каждый префикс l oop,

# let rec n_times (f, n, v) =
    if n > 0 then
        n_times (f , n-1 , f::v)
    else
      v;;
val n_times : 'a * int * 'a list -> 'a list = <fun>
# n_times(2,3,[4]);;
- : int list = [2; 2; 2; 4]
# n_times(2,5,[4]);;
- : int list = [2; 2; 2; 2; 2; 4]

Это позволяет увеличивать список с каждым l oop.

0 голосов
/ 18 февраля 2020

Вы определили функцию для получения трех значений. Поэтому, когда вы называете это рекурсивно, вам нужно указать 3 кортежа:

n_times (f, n - 1, f v)
...