Хорошо известно, что экземпляры Monad
должны соблюдать законы Монады. Возможно, менее известно, что экземпляры Functor
должны следовать законам Functor. Тем не менее, я бы довольно уверенно писал правило перезаписи GHC, которое оптимизирует fmap id == id
.Какие законы являются стандартными классами классов Haskell, которые должны поддерживаться?
Какие еще стандартные классы имеют неявные законы? (==)
должно быть истинным отношением эквивалентности? Ord
должны быть частичным заказа? Общий порядок? Можем ли мы хотя бы предположить, что это транзитивно? Анти-симметричны?
Эти последние несколько, кажется, не указаны в отчете Haskell 2010, и я не уверен, что буду писать правила перезаписи, используя их. Однако существуют ли какие-либо общие библиотеки? Как патологический пример может написать уверенно?
И, наконец, если предположить, что существует граница для того, насколько патологическим может быть такой экземпляр, существует ли стандартный всеобъемлющий ресурс для законов, которые должны поддерживаться каждым экземпляром класса типов?
В качестве примера, сколько проблем я был бы, чтобы определить
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
это просто трудно понять, или будет ли компилятор оптимизировать неправильно где-нибудь?
Обратите внимание, что довольно много законов разумного звучания (включая те, которые неявно предполагаются существующим кодом), которые можно предложить для 'Ord',' Num' и связанных классов, будут нарушены экземплярами ' Float' и 'Double'. Например, использование NaN в качестве ключевых разрывов в «Data.Map» и проблемах точности означает, что сложение с плавающей запятой не является ассоциативным. –
@ C.A.McCann, что просто означает, что прелюдия имеет примеры, которые она не должна! 'Float' и' Double' не должны быть членами 'Eq' –
@PhilipJF: С одной стороны, я согласен. Но их экземпляр «Num» немного лучше, и после этой строки аргумента к его логическому завершению приводит к удалению каждого экземпляра, который сделает типы с плавающей точкой практически полезными. Кстати, [я продемонстрировал, как сломанный экземпляр «Ord» находится в старой записи.] (Http://stackoverflow.com/a/6399798/157360) –