Функция Ocaml для преобразования кортежа в список - PullRequest
2 голосов
/ 12 февраля 2012

У меня есть (int * string) кортеж, который я хочу преобразовать в список.Кортеж имеет форму (N, E), где N - число вхождений элемента E. Функция должна возвращать список с N вхождениями E в нем.Пример ниже.Предположим, эта функция называется tuple_decode.

tuple_decode (1, "A") -> ["A"]
tuple_decode (2,"B") -> ["B";"B"]
tuple_decode (4,"C") - > ["C";"C";"C";"C"]

Функция tuple_decode выглядит следующим образом

let tuple_decode acc (n,elem)   = 
let add_one_elem i = 
    match i  with
           0 -> acc
         | i -> elem :: acc ; add_one_elem (i-1)  (* Line 184 *)
in
add_one_elem n 
;;

, когда я пытаюсь скомпилировать эту функцию, я получаю следующую ошибку.

File "all_code.ml", line 184, characters 11-22:
Warning 10: this expression should have type unit.
File "all_code.ml", line 184, characters 25-37:
Error: Unbound value add_one_elem

Может ли кто-нибудь помочь мневыясните, почему я получаю эту ошибку и предупреждение.

С уважением, Puneet

1 Ответ

6 голосов
/ 12 февраля 2012

Предупреждение приходит от композиции последовательности с использованием ;.Когда вы пишете S1 ; S2, компилятор ожидает, что S1 будет иметь тип unit.Но здесь S1 возвращает список (elem::acc) , значение которого будет выброшено.Более того, поскольку вы не передали acc в качестве аргумента, его значение не изменяется после всех рекурсивных вызовов.

Ошибка связана с рекурсивным использованием add_one_elem.Поскольку вы не использовали ключевое слово rec, при вызове add_one_elem (i-1) OCaml не знает, что add_one_elem рекурсивно определяется.

Кроме того, acc должен быть параметром add_one_elem для накопления результатов:

let tuple_decode (n, elem) = 
  let rec add_one_elem i acc = 
      match i  with
      | 0 -> acc
      | i -> add_one_elem (i-1) (elem::acc)
  in add_one_elem n [] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...