Изучая Haskell, я столкнулся с проблемой найти две функции f
и g
, такие, что f g
и f . g
эквивалентны (и всего, поэтому такие вещи, как f = undefined
или f = (.) f
don не в счет). Данное решение состоит в том, что f
и g
оба равны \x -> x . x
(или join (.)
).
(отмечу, что это не характерно для Хаскелла; это можно выразить в чистой комбинаторной логике как «найди f
и g
такие, что f g = B f g
», и данное решение будет затем преобразовано в f = g = W B
.)
Я понимаю, почему данное решение работает, когда я расширяю его, но я не понимаю, как вы могли бы его найти, если бы вы его еще не знали. Вот как далеко я могу пройти:
f g = f . g
(дано)
f g z = (f . g) z
(eta-расширение обеих сторон)
f g z = f (g z)
(упрощение RHS)
И я не знаю, как действовать дальше. Что я буду делать дальше, пытаясь найти решение?