Ответ HTNW охватывает ваш тестовый пример и способ доказательства уравнения с использованием определения test
.Я бы сказал, что все еще существует основной вопрос: откуда мы должны были вывести это уравнение - почему мы должны даже рассматривать возможность того, чтобы оно было правдой?Чтобы ответить на этот вопрос, давайте начнем со второго взгляда на уравнение:
test p . f = map f . test (p . f)
На словах это говорит о том, что изменение значения осуществляется с помощью некоторой функции f
, а затем, с учетом некоторого подходящего предиката p
,применение test p
к нему аналогично изменению значения после использования test
(с предикатом, соответствующим образом модифицированным путем компоновки его с f
, чтобы он соответствовал типу неизмененного значения).
Далее, давайте рассмотрим тип test
:
-- I'm adding the implicit forall for the sake of emphasis.
forall a. (a -> Bool) -> a -> [a]
Здесь важно то, что функция с этим типом должна работать при любом выборе a
.Если это может быть что-то, мы ничего не знаем об этом заранее при реализации функции с этим типом, например test
.Это серьезно ограничивает возможности такой функции: в частности, все элементы списка результатов, если таковые имеются, должны совпадать с предоставленным значением типа a
(как мы можем изменить его на что-то другое, не зная его типазаранее?), и предикат должен быть либо проигнорирован, либо применен к тому же значению (к чему бы мы еще применили его?).Принимая это во внимание, то, что говорит уравнение, теперь кажется естественным: не имеет значения, изменим ли мы значения с f
до или после test
, потому что test
не изменит значения самостоятельно.
Один из способов сделать подобные рассуждения строгими - использовать свободные теоремы.Свободная теорема для типа, благодаря параметрическому полиморфизму, гарантированно всегда выполняется для любого возможного значения этого типа, и вам не нужно ничего, кроме типа, чтобы выяснить это.Бывает, что свободная теорема для forall a. (a -> Bool) -> a -> [a]
точно равна test p . f = map f . test (p . f)
.Поскольку я не могу отдать должное предмету в этих коротких строках, вот несколько ссылок о свободных теоремах: