Приведение в исполнение gflist_vt_mergesort$cmp
В gflist_vt.sats, подпись gflist_vt_mergesort$cmp
подразумевает, что порядок, используемый для сортировки, должен быть таким же, как и для марки. Я понимаю, что если дана такая функция сравнения, то она гарантирована.
В этом примереgflist_vt_mergesort$cmp
похоже, реализовано с использованием небезопасного приведения.
- Безопасно ли это делать? (т.е. это не вызывает каких-либо проблем? например, что если список сортируется несколько раз с разным порядком?)
- Есть ли другой (более безопасный) способ?
1 ответ
Решение
Небезопасное литье по своей сути небезопасно.
Небезопасное литье может быть удалено. Для этого вам нужно реализовать абстрактный тип stamped_vt0ype
(который дан псевдоним stamped_vt
). Например, чтобы отсортировать список целых чисел в порядке убывания, вы можете сделать что-то следующим образом:
local
assume stamped_vt0ype(_, i) = int(~i)
in (* in-of-local *)
implement
{a}
gflist_vt_mergesort$cmp(x, y) = g1int_sgn(y - x)
end // end of [local]
Тем не менее, выполнение чего-то подобного не дает большого смысла в практическом программировании.