Это действительно из-за ограничения стоимости. Я не вижу, чтобы в разделе документации, на который вы ссылаетесь, что-то говорилось о возможности использовать аннотацию типа, чтобы избежать этого, хотя мне кажется, что так и должно быть. Надеюсь, что некоторые опытные OCamler здесь могут объяснить, почему это не так.
Насколько я знаю, если аннотация типа не содержит никаких переменных типа, тем самым удаляя полиморфизм, он не будет, и я не будуЯ думаю, это то, что ты хочешь. Самый простой способ исправить это - использовать eta-расширение, то есть сделать аргумент явным, а не использовать частичное приложение. Это демонстрирует и:
module TestB = {
let minFn = (a, b) => a < b ? a : b;
let maxFn = (a, b) => a > b ? a : b;
let reduceList = (comp, numbers) =>
switch (numbers) {
| [] => None
| [head] => Some(head)
| [head, ...tail] => Some(List.fold_left(minFn, head, tail))
};
let min = x => reduceList(minFn, x);
let max : list(int) => option(int) = reduceList(maxFn);
};
Подчеркивание, _
в '_a
просто означает, что это переменная слабого типа, как объясняется в документации, к которой вы обращаетесь:
Типпеременные, чье имя начинается с префикса _weak типа '_weak1, являются переменными слабо полиморфного типа, иногда сокращаются как переменные слабого типа. Переменная слабого типа является заполнителем для одного типа, который в настоящее время неизвестен. Как только конкретный тип t за типом заполнителя '_weak1 известен, все вхождения' _weak1 будут заменены на t.