Несоответствие типов OCaml? - PullRequest
       23

Несоответствие типов OCaml?

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

У меня проблема, OCaml считает, что параметры a и s моей функции unit list с, но они должны быть 'a list и string соответственно.Функция должна выводить элементы списка, разделенные заданным разделителем.

Результатом должна быть строка со следующим вводом: "This-is-label"

PS Я знаю осоответствует, но я не могу использовать это

let rec function1 a s =
    if a = [] then failwith "Empty list" else 
    if List.tl a = [] then List.hd a else
    if List.tl a != [] then List.hd a; s; function1 List.tl a s
    ;;

function1 ["This"; "is"; "label"] "-";;

Ответы [ 2 ]

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

Проблема в вашем коде отсутствует () около List.tl a в рекурсивном вызове.Также ^ должен использоваться для объединения строк вместо ;.Код по-прежнему очень не похож на ocaml.

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

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

Две альтернативные реализации:

let rec join s = function
| [] -> "" (* or failwith "Empty list" if you insist *)
| [x] -> x
| x::xs -> x ^ s ^ join s xs

let join s a =
  let (res, _) =
    List.fold_left
      (fun (acc, sep) x -> (x ^ sep ^ acc, s))
      ("", "")
      a
   in
   res
0 голосов
/ 23 октября 2018

Кажется, вы ожидаете, что это выражение будет строкой:

List.hd a; s; function1 List.tl a s

Однако значение оператора ; заключается в том, чтобы вычислить выражение слева и затем проигнорировать его значение.(Также считается плохой формой, если тип не является единицей.) Затем оцените выражение справа, которое является значением выражения.

Итак, это выражение говорит, что нужно оценить List.hd a, затем забудьтеЗначение.Затем оцените s, затем забудьте значение.Затем оцените рекурсивный вызов.

Итак, первая проблема - собрать эти вещи в строку.

Оператор ^ объединяет две строки.Итак, что-то вроде этого ближе к тому, что вы хотите:

List.hd a ^ s ^ function1 (List.tl a) s

Обратите внимание, что вам нужно заключить в скобки вызов List.tl.В противном случае это выглядит как два отдельных параметра для function1.

...