2010-11-27 1 views
1

Я пытаюсь создать перестановки строк, содержащихся в списке в OCaml. Я до сих пор работал над следующим фрагментом кода, но перед этим столкнулся с проблемой передачи первой строки списка в мой метод.Ошибка - Рекурсивные вызовы функций с помощью списков прогона - OCaml

Логика для кода: Переходите к каждому элементу списка и добавьте каждый элемент с элементом списка. Продолжайте делать до тех пор, пока все элементы не будут добавлены к списку во всех возможных положениях.

Код:

(* this function appends each string to each word in the list example: "A" with "ABC" *) 
let appendtocode n word = 
    let f x = n^x in 
    f word  
;; 

(* this function extracts every element of the list and appends it with the string. 
Example: "A" with ["AAA","ABC","ACD"] etc.. *) 
let appendtolist n list = 
    let f x = 
     if (List.length list) > 0 then list 
     else ((appendtocode n (List.hd list))^(appendtolist n (List.tl list))) 
    in 
    List.map f list 
;; 

Ошибка:

Я получаю эту ошибку:

несвязанного значение appendtolist

Происходит при вызове: (appendtolist п списка List.tl)

Мой список состоит только из строки. Я все еще работаю над кодом. Но застрял в этом из-за этой ошибки.

Пожалуйста, помогите !!! Любой вход будет отличным.

+0

Почему это помечено sml и smlnj, если вы используете ocaml? – sepp2k 2010-11-27 23:40:04

+1

Я исправил теги, так как это определенно OCaml и не имеет очевидной связи с SML. – Porculus 2010-11-27 23:42:14

ответ

2

Чтобы вызвать функцию рекурсивно, вам нужно определить его let rec appendtolist, а не просто let appendtolist.

Вы тогда получите другую ошибку, потому что есть другие ошибки в коде ...

0

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

else ((append-to-code n List.hd list)^(append-to-list n List.tl list)) 

должен быть

else ((append-to-code n (List.hd list))^(append-to-list n (List.tl list))) 
1

Вы получаете ошибку «Освобожденное значение appendtolist», потому что вы вызываете appendtolist рекурсивны без объявления, как рекурсивные.

Необходимо указать let rec appendtolist n list = ..., чтобы иметь возможность ссылаться на appendtolist рекурсивно в пределах своего определения.

 Смежные вопросы

  • Нет связанных вопросов^_^