Вот программка на Хаскеле
sayMe :: (Integral a) => a -> String
sayMe x
| x <= 2 = "Less then three!"
sayMe 1 = "One!"
main = putStrLn (sayMe 1)
-- результат зависит от порядка определений
Эта штука мне нравится, поскольку по сути это тот «полиморфизм», который гениально прост и при этом не налагает никаких требований на систему типов. В С++ или в CLOS методы выбираются не по порядку определения, а по отношению «предок-потомок», или, иными словами «тип-подтип». Это отношение не всегда легко определить.
Но у меня вопросы:
1. Могу ли я размазать определение sayMe по нескольким модулям, ничего не знающим друг про друга?
2. Если да, то как при этом выстраивается порядок определений? Ведь обычно при сборке мы не точно знаем порядок впихивания модулей в готовый исполняемый файл.
3. Есть ли способ воткнуть своё определение перед первым определением, задав свой частный случай?