Согласно Харперу (https://existentialtype.wordpress.com/2011/04/16/modules-matter-most/), кажется, что Type Classes просто не предлагают тот же уровень абстракции, который предлагают Модули, и я "Мне трудно понять, почему. И в этой ссылке нет примеров, поэтому мне трудно увидеть ключевые отличия. Существуют также другие статьи о том, как переводить между модулями и классами типов ( http://www.cse.unsw.edu.au/~chak/papers/modules-classes.pdf), но это не имеет ничего общего с реализация в перспективе программиста (он просто говорит, что нет ничего, что можно было бы сделать, чтобы другой не мог эмулировать).
В частности, в первая ссылка:
Во-первых, они настаивают на том, что тип может реализовать класс типа одним способом. Например, согласно философии классов типов, целые числа можно упорядочить точно одним способом (обычным порядком), но, очевидно, существует много упорядочений (например, делимости), представляющих интерес. Во-вторых, они смешивают две отдельные проблемы: указание того, как тип реализует класс типа и указывает, когда такая спецификация должна использоваться во время вывода типа.
Я тоже не понимаю. Тип может реализовать класс типа более чем одним способом в ML? Как бы у вас были целые числа, упорядоченные по делимости на примере, без создания нового типа? В Haskell вам нужно будет сделать что-то вроде использования данных и предложить instance Ord
альтернативный порядок.
И второй, разве не два отличаются в Haskell? Указание "когда такая спецификация должна использоваться во время вывода типа" может быть выполнена следующим образом:
blah :: BlahType b => ...
где BlahType - это класс, используемый во время вывода типа, а НЕ - для класса реализации. Принимая во внимание, что "как тип реализует класс типа" выполняется с помощью instance
.
Может кто-нибудь объяснить, что ссылка действительно пытается сказать? Я просто не совсем понимаю, почему модули будут менее ограничительными, чем Type Classes.