Несоответствие типов между List.reduce и определенным типом - PullRequest
1 голос
/ 23 июня 2010

Я пытаюсь создать массив функций, который я использую внутри List.reduce HOF.Раньше у меня был

let minimax = [| (min : int->int->int); max |]

, который прекрасно работал, но теперь я хочу получить максимальное значение списка, поэтому я подумал:

let minimax = [|List.min; List.max|]

Это, однако, бросаетследующая ошибка:

Minimax.fs (175,5): ошибка FS0030: ограничение значения.Значение 'minimax' было выведено, чтобы иметь универсальный тип val minimax: ('_a list ->' _a) [] когда '_a: сравнение
Либо определите' minimax 'как простой термин данных, сделайте его функцией сявные аргументы или, если вы не хотите, чтобы он был универсальным, добавьте аннотацию типа.

Я добавил аннотацию типа, подобную этой:

let minimax = [|(List.min:TreeOfPosition list -> TreeOfPosition); List.max|]

, и она скомпилирована.Проблема сейчас заключается в List.reduce,

| BranchP(position, children) -> List.reduce (minimax.[minOrmax]) (List.map (loop (1 - minOrmax)) children)

Несоответствие типов.Ожидание TreeOfPosition -> TreeOfPosition -> TreeOfPosition, но с учетом списка TreeOfPosition -> TreeOfPosition Тип «TreeOfPosition» не соответствует типу «TreeOfPosition list»

Спасибо за любой совет,

Pedro Dusso

1 Ответ

4 голосов
/ 23 июня 2010

Проблема в том, что min работает с двумя значениями, а List.min работает со списком значений, поэтому вы не можете просто заменить одну функцию другой. Поскольку List.min в основном определяется как List.reduce min, вы, вероятно, можете просто избавиться от List.reduce и применить minimax[minormax] напрямую. Я не понимаю, как это может быть лучше, чем ваше оригинальное решение с min и max, хотя ... возможно, вы могли бы предоставить какой-то дополнительный контекст, чтобы было яснее, какую именно проблему вы пытаетесь решить. *

...