Я хотел бы определить оператор l_op : A list * A list -> A list
, для реализации которого требуется другой оператор op : A * A -> A
. Учитывая a0: A
, хотя для всех a1 : A
op a0 a1
всегда возвращает результат как A
, для некоторых a1
результат имеет больше смысла , чем для других a1
.
Интуитивно l_op al0 al1
нужна стратегия соответствия , которая находит значимый элемент al1
относительно op
для каждого элемента al0
. Тогда список результатов по op
будет результатом l_op
.
Так что мне нужна мера , означающая .
Одним из возможных вариантов является определение функции measure: A * A * A -> int
. Например, measure a0 a1 (op a0 a1)
дает int от 1 до 10, что представляет, как op a0 a1
имеет смысл. Затем в реализации l_op al0 al1
для каждого a0
из al0
я могу найти a1
такой, что measure a0 a1 (op a0 a1) >= measure a0 a1' (op a0 a1') for all a1' in al1
. Затем я удаляю a0
и a1
из двух списков и сопоставляю остальные два списка ...
Другой вариант, я немного изменяю op
на op : A * A -> A * int
, где целое число представляет, как операция имеет смысл. Затем в реализации l_op al0 al1
для каждого a0
из al0
я могу найти a1
такой, что for all a1' in al1, m1 >= m1' where (_, m1), (_, m1') = op a0 a1, op a0 a1'
.
Преимущество второго варианта в том, что мы можем сохранить некоторый код, потому что мы можем вычислить измерение при выполнении op a0 a1
. Недостатком является то, что подпись op : A * A -> A * int
выглядит менее привлекательно, чем op : A * A -> A
.
Итак, мои вопросы:
1) Для этого вида измерительной функции есть условное слово (которое начинается, вероятно, с h
), но я забыл его, кто-нибудь может напомнить?
2) Как вы думаете, int
- это хороший тип для измерения? Может быть, мы можем определить тип для этого ... Какой самый обычный способ?
3) Какой выбор, который я упомянул выше, лучше? Или у кого-нибудь есть идея получше?