Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Перекметтифицировать Кметта непросто!

Кметтификация через профункторы почти не удалась - cata/ana являются частным случаем hylo (c "тривиальной" коалгеброй/алгеброй соответственно), а отец всех схем hylo симметричный, и с ним ничего не сделаешь, получаются соревнования по перетягиванию одеяла на себя.
{-# LANGUAGE LambdaCase, FlexibleInstances, MultiParamTypeClasses #-}
module Main where

import Data.Profunctor
import Data.Functor.Foldable
import Control.Newtype
import Data.Function

cataR f = hyloR f project
anaR f = hyloR embed f

hyloR :: Functor f => (f b -> b) -> (a -> f a) -> a -> b
hyloR f g = fix (protoHylo4 f g)

protoHylo1, protoHylo2, protoHylo3, protoHylo4
        :: Functor f => (f b -> b) -> (a -> f a) -> (a -> b) -> a -> b

protoHylo1 f g c = f . fmap c . g
protoHylo2 f g c = under Costar (lmap c) f . g
protoHylo3 f g c = f . under Star (rmap c) g
protoHylo4 f g = dimap g f . fmap

instance Newtype (Costar f d c) (f d -> c) where
        pack = Costar
        unpack = runCostar

instance Newtype (Star f d c) (d -> f c) where
        pack = Star
        unpack = runStar

sumR = \case
        Cons a b -> a + b
        Nil -> 0 :: Int

main = print $ 42 == cataR sumR [40, 2]
Tags: fp, haskell, programming
Subscribe

  • Post a new comment

    Error

    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.
  • 0 comments