Хорошо известно, что экземпляры Monad должны подчиняться законам монад. Возможно, менее известно, что экземпляры Functor должны следовать законам функтора. Тем не менее, я бы чувствовал себя достаточно уверенно, написав правило перезаписи GHC, оптимизирующее fmap id == id.
Какие еще стандартные классы имеют неявные законы? Должен ли (==) быть истинным отношением эквивалентности? Должен ли Ord формировать частичный заказ? Полный порядок? Можем ли мы хотя бы предположить, что оно транзитивно? Антисимметричный?
Эти последние несколько, похоже, не указаны в отчете Haskell 2010, и я не чувствую себя уверенно при написании правил перезаписи, использующих их. Однако существуют ли какие-либо общие библиотеки? Насколько патологический экземпляр можно уверенно писать?
Наконец, если предположить, что существует граница того, насколько патологическим может быть такой экземпляр, существует ли стандартный всеобъемлющий ресурс для законов, которые должен соблюдать каждый экземпляр класса типов?
Например, сколько проблем у меня возникло бы, чтобы определить
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
это просто сложно понять или компилятор везде неправильно оптимизирует?
Ord,Numи родственных классов, будут нарушены экземплярами дляFloatиDouble. Например, использование NaN в качестве ключа прерывает поиск вData.Map, а проблемы с точностью означают, что сложение с плавающей запятой не является ассоциативным. - person C. A. McCann   schedule 13.02.2013FloatиDoubleне должны быть членамиEq- person Philip JF   schedule 14.02.2013Numнемногим лучше, и следование этой аргументации до логического завершения приводит к удалению всех экземпляров, которые могли бы сделать типы с плавающей запятой практически полезными. Между прочим, я продемонстрировал, насколько неисправен их экземплярOrdв старом сообщении. - person C. A. McCann   schedule 14.02.2013Prelude? Если вам действительно нужно число с плавающей запятой (а не отношение или конструктивное число), вы, вероятно, все равно знаете, что делаете. - person Philip JF   schedule 14.02.2013