два последовательных рекурсивных вызова OCaml - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующая функция:

let extract n l =
    let rec aux acc pro = function
         |[]   -> acc
         |a::b -> if (List.length pro) = n then aux (pro::acc) [] (a::b) else aux acc (a::pro) b; aux acc (pro) b
    in aux [] [] l

Как вы можете видеть в моем сопоставлении с образцом в случае второго теста, я вызываю функцию два раза.Является ли это возможным ?

Так что возможно иметь такую ​​функцию:

let rec some_function = function
   | [] ->[]
   | a::b -> some_function b; some_function b (*so I am calling two times the function in a single test*)

Я задаю этот вопрос, потому что здесь у меня есть следующее предупреждение:

File "main.ml", line 4, characters 48-72:
Warning 10: this expression should have type unit.

Так чтопроблема именно в том месте, где я дважды вызывал мою рекурсивную функцию.Это может быть потому, что я использую ;, но в этом случае, как я мог бы разделить эти два вызова?

Спасибо!

Ответы [ 2 ]

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

Чтобы добавить в ответ FlorianWeimer, некоторую информацию о вашем сообщении об ошибке.

Warning 10: this expression should have type unit.

Строго напечатан OCaml.Поэтому, если функция возвращает, скажем, целое число или список, и вы ничего с этим не делаете, она спросит, что происходит, и предупредит вас.

Вызов функции, такой как print_int 5;, возвращает() типа unit.По сути это означает, что он ничего не возвращает, потому что вы не вызываете его для вычисления чего-либо, а для выполнения чего-либо.Он сделал это, и теперь он возвращается, и вы идете дальше.

Но вызов функции, такой как float_of_int 5;, возвращает значение (число с плавающей запятой 5.0).Вы (вероятно) не призывали это к делать что-то, а вычислять что-то, и то, что он возвращает, вас интересует.То же самое относится к арифметическим выражениям, таким как 3+6;, или к прямым значениям, таким как 10; или "abc"; или [];.

. Поэтому, если вы пишете одну из этих вещей, которая имеет значение, и вы нене используйте это значение (в присваивании или в качестве параметра другой функции), OCaml предупреждает вас.Он говорит вам: «Я вычислил то, что не назначил, не вернул и не использовал в качестве аргумента чего-то другого. Обычно вещи типа unit являются единственными подобными вещами. Вы уверены, чтов вашем коде нет ошибки? "

Иногда вы знаете, что делаете, и вам не нужно это предупреждение.В этом случае вы можете вызвать функцию ignore.ignore возьмет что-нибудь и проигнорирует это, вернув ().Например, ignore 5; или ignore (float_of_int 10); не будут выдавать предупреждения «это выражение должно иметь единицу измерения», которые вы получите с 5; или float_of_int 10;.

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

Это возможно в том смысле, что компилятор принимает это, но это имеет смысл, только если вы что-то делаете с результатом (или функция имеет побочный эффект).Классическим примером для двух вызовов функций является рекурсивное вычисление последовательности Фибоначчи:

let rec fib = function
  | 0 -> 0
  | 1 -> 1
  | n -> fib (n - 1) + fib (n - 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...