Я возился с F # и пытался написать функцию, которая может принимать int list
или string list
. Я написал функцию, которая является логически общей, в которой я не могу изменить ничего, кроме типа аргумента, и она будет работать с обоими типами списка. Но я не могу дать общее определение, чтобы принять оба.
Вот моя функция без аннотации типа:
let contains5 xs =
List.map int xs
|> List.contains 5
Когда я пытаюсь аннотировать функцию для составления общего списка, я получаю предупреждение FS0064: the construct causes the code to be less generic than indicated by the type annotations
. Теоретически мне не нужно комментировать это, чтобы это было общим, но я все равно попробовал.
Я могу скомпилировать это в двух отдельных файлах, один с
let stringtest = contains5 ["1";"2";"3";"4"]
и еще один с
let inttest = contains5 [1;2;3;4;5]
В каждом из этих файлов компиляция завершается успешно. С другой стороны, я могу отправить определение функции и один из тестов интерпретатору, и вывод типа выполняется просто отлично. Если я пытаюсь скомпилировать или отправить интерпретатору определение функции и оба теста, я получаю error FS0001: This expression was expected to have type string, but here has type int
.
Я неправильно понимаю, как должен работать набор текста? У меня есть функция, чей код может обрабатывать список целых или список строк. Я могу успешно проверить это с любым. Но я не могу использовать это в программе, которая обрабатывает оба?