Andy Melnikov (nponeccop) wrote,
Andy Melnikov

Как прострелить ноги анаморфизмом

Берём анаморфизм, пишем filter:
import Data.Functor.Foldable

xfilter :: (a -> Bool) -> [a] -> [a]
xfilter f = ana $ project . phi f
phi :: (a -> Bool) -> [a] -> [a]
phi f (h : t) | not (f h) = t
phi f l = l
*Main> xfilter odd [1..10]
*Main> xfilter even [1..10]
Годится? А вот хуй там, никакой это не filter! Но лечится довольно просто:
psi :: (a -> Bool) -> [a] -> [a]
psi f (h : t) | not (f h) = psi f t
psi f l = l
Но это же рекурсия, недостойно джедая. Пробуем композицию ана- и параморфизма:
xfilter :: (a -> Bool) -> [a] -> [a]
xfilter f = ana . para $ phi where
	phi Nil = Nil
	phi (Cons h (t, tt)) | f h = Cons h t
 	phi (Cons h (t, tt)) = tt
Спросил на SO, можно ли сделать лучше. Цель - избавиться у сассы от 'лишнего', как мне кажется, toList'.

  • Post a new comment


    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment