Кто-нибудь знает (или помнит), как нарушение классовых законов может вызвать проблемы в GHC? - PullRequest
6 голосов
/ 07 августа 2011

Через некоторое время после того, как я спросил Что с вами случится, если вы нарушите законы монады? Я наткнулся на эту необъяснимую фразу в Haskell Wiki на странице о Безопасный запуск ненадежного кода на Haskell :

"создание экземпляров классов, которые нарушают принятые законы (ср. EvilIx)"

как пример эксплойта, который был возможен против lambdabot.

Поскольку lambdabot использует GHC, предположительно, это была ошибка (или особенность) GHC, делающая предположения о классовых законах. Кто-нибудь помнит что это? И случалось ли это когда-либо (или могло ли это быть) случайно?

(поиск в "haskell + Evillx" не дал результатов).

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Массивы используют Ix для управления границами. Они верят, что Ix делает то, что говорит. Если это не так, вы можете обмануть механизмы массива, чтобы получить доступ к не принадлежащим им ячейкам памяти.

ср EvilIx: http://www.haskell.org/pipermail/haskell-cafe/2006-December/019994.html

4 голосов
/ 07 августа 2011

Если мы думаем о монаде как о моделировании побочных эффектов, тип, претендующий на звание монады, но несоблюдение законов может привести к последствиям, происходящим в неправильном порядке или неправильном количество раз.

Классическим примером этого является ListT, преобразователь монад списка. Первоначальная реализация не удовлетворяла законам монады. " ListT сделано правильно На вики-странице есть несколько простых примеров использования ListT в разделе " Примеры ". Вы можете увидеть разницу между тем, что делают эти программы когда вы запускаете их с оригиналом реализация, которая нарушает законы, и когда вы запускаете их с заменой, которая удовлетворяет законам.

...