В чем разница между (‘a * ‘a) списком и ‘a * ‘ списком в ocaml?

#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 строки where a и a2 are. Но я получаю сообщение об ошибке, в котором оно теперь правильно ожидает (string * string) list (я изменил типы на правильные), но строка имеет тип string * string list . Почему это происходит? Должен ли я спросить об этом в новом сообщении?

4. Трудно сказать без дополнительного контекста.

Ответ №2:

An ('a * 'a) list — это список ('a * 'a) кортежей, в то время как a 'a * 'a list — это кортеж an 'a со списком 'a .