тип несовпадения ocaml против списка - PullRequest
0 голосов
/ 05 мая 2018

за эту подпись

val chooser: string list * string list -> string list

и эта реализация

 let rec chooser (inputList, trueList) = match inputList with
      [] -> []
    | iH::iT -> if (List.hd trueList)="True" 
        then iH::(chooser iT List.tl trueList)

Я получаю следующую ошибку:

Ошибка: ожидается, что у этого варианта выражения будет тип Конструктор :: не принадлежит блоку

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Результат if ... then без else должен быть unit, потому что значение будет () (значение типа unit), когда выражение ложно.

Другими словами, вам нужна деталь else для вашего if, чтобы получить нужный тип. Каким должно быть значение, если сравнение ложно?

0 голосов
/ 05 мая 2018

часть else явно не определена - поэтому, когда условие не определяется, остальная часть - это () (то есть единица измерения). Тип компилятора проверяет iH::(chooser iT List.tl trueList) как unit, чего не может быть:

 if cond
    then A
    else B

A и B имеют одинаковые типы.

...