макс парная функция стандартная мл - PullRequest
0 голосов
/ 25 марта 2012

Я пытаюсь создать функцию в стандартном ml, которая принимает список пар целых чисел, и я должен вернуть список int, содержащий элемент max из пар. (int * int) list -> int list. Пока что я написал код, но он не работает, и я не могу понять проблему из-за ошибки, которую он дал.

Вот код:

- fun maxpairs x = 
=   foldr (fn (a, b) => if a > b then a else b) [] x;

И вот ошибка, которую я получаю:

stdIn:15.2-15.50 Error: operator and operand don't agree [overload]
  operator domain: 'Z
  operand:         'Y list
  in expression:
    (foldr (fn (<pat>,<pat>) => if <exp> then <exp> else <exp>)) nil

1 Ответ

1 голос
/ 25 марта 2012

foldr принимает функцию типа ('a * 'b) -> 'b, значение типа 'b и список типа ['a]. В вашем случае список представляет собой список пар, а значение типа 'b представляет собой пустой список. Это означает, что в функции fn (a,b) => ... a будет пара, а b будет список. Затем вы пытаетесь сравнить a и b, используя >. Поскольку > нельзя использовать с парой в качестве левого операнда и списком в качестве правого операнда, это не работает. Также вы не можете иметь оператор if, где выражение then и выражение else имеют разные типы.

Если бы я был на вашем месте, я бы использовал для этого карту, которая, кажется, лучше подходит для этой проблемы, чем фолд.

...