#ocaml
#ocaml
Вопрос:
Я пытаюсь создать список типов string * string list
(тип которых требуется в других функциях), и я продолжаю получать ошибки несоответствия типов. Если бы я определил список как let a = [("a" , "b")]
, я получаю сообщение об ошибке, когда передаю его в функцию, которая ожидает тип string * string list
:
Error: This expression has type (string * string) list
but an expression was expected of type string * string list
Та же ошибка возникает , когда a объявляет его как let a = ["a" , "b"]
. Почему это происходит?
Ответ №1:
Вы неправильно читаете тип: тип application привязывается сильнее, чем product, таким образом
string * string list
означает
string * (string list)
Например:
let x: string * string list = "a", ["b"]
по сравнению с
let y : (string * string) list = ["a", "b"; "c", "d"]
Комментарии:
1. Я думаю, что последнее верно, в записи для моей домашней работы говорится, что мой вывод должен выглядеть примерно так
[ ("crooner", "conqueror"); ("italy", "quality"); ("stir", "squirt"); ("teens", "sequent")].
, но тип вывода в записи для функции такойstring * string list
.2. Возможно, опечатка в типе записи? Приведенный пример вывода имеет тип
(string * string) list
, а неstring * string list
.3. Спасибо, вероятно, опечатка. В программе возникает еще одна ошибка: у меня есть
(a, a2)::rest of the list
строки wherea
иa2
are. Но я получаю сообщение об ошибке, в котором оно теперь правильно ожидает(string * string) list
(я изменил типы на правильные), но строка имеет типstring * string list
. Почему это происходит? Должен ли я спросить об этом в новом сообщении?4. Трудно сказать без дополнительного контекста.
Ответ №2:
An ('a * 'a) list
— это список ('a * 'a)
кортежей, в то время как a 'a * 'a list
— это кортеж an 'a
со списком 'a
.