?

Log in

No account? Create an account

[icon] /^.in$/
View:Recent Entries.
View:Archive.
View:Friends.
View:Profile.
View:Website (/me (домен, хотящийся в углу комнаты)).
Missed some entries? Then simply jump to the previous day or the next day.

Tags:
Security:
Subject:Обратные функции и паттерн-матчинг
Time:01:28 am
Пусть у нас есть функция-примитив cons с типом forall a . a -> [a] -> [a] (любители System F могут отбросить часть до точки).
А также функции head с типом forall a . [a] -> a и tail с типом forall a . [a] -> [a].

Тогда Хаскелевский оператор (:) можно чудесным образом реализовать как:
(:) a b = cons a b

Изоморфный ему в uncurry форме:
(:) (a,b) = cons a b

или:
(:) t = cons (fst t) (snd t)


Элементарно, да? Забавная мысль заключается в том, что, если посмотреть на левую часть определения функции:
sumall [] = 0
sumall (a:b) = a + sumall b

то там написана обратная функция к (:):
(:)' l = (head l, tail l)


А потому, если предоставить юзеру возможность определять свои обратные функции, то из всех паттерн-матчингов можно оставить только распаковку таплов, а остальные операции сводить к этой. Тогда доступным удовольствием, например, является радость жизни с программами а-ля:
sumallStack emptyStack = 0
sumallStack (a `push` s) = a + sumallStack s


Дальше мне разговляться на эту тему лень, но замечу, что слева от знака равно стоит не совсем обратная функция, а предикат с обратной функцией, но это не суть важно. Главное то, что меня иногда жутко тянет заиметь такую фичу, чтобы оборачивать в клёвый синтаксический сахар всякие премудрые упаковки/распаковки/etc.
И ещё замечу, что в языках с какими-нибудь зависимыми типами, например, можно даже попытать счастья в доказательстве того, что композиция обратной функции и её прямой версии есть id.
withComments $ arr (take 8) >>> delay new

[icon] /^.in$/
View:Recent Entries.
View:Archive.
View:Friends.
View:Profile.
View:Website (/me (домен, хотящийся в углу комнаты)).
Missed some entries? Then simply jump to the previous day or the next day.