generic-recursion-schemes
generic-recursion-schemes copied to clipboard
Folds for recursive types with GHC Generics
Generic catamorphisms
Derive folds on recursive types.
This library is compatible with the recursion-schemes library, and uses GHC Generics instead of Template Haskell to derive base functors and recursion combinators.
cataG
and anaG
can also be used directly, without defining Recursive
or
Corecursive
instances.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeApplications #-}
import GHC.Generics
import Data.Functor.Foldable -- recursion-schemes
import Generic.RecursionSchemes
data MyTree = Leaf Int | Node MyTree MyTree
deriving Generic
type instance Base MyTree = GBase MyTree
instance Recursive MyTree where
project = projectG
instance Corecursive MyTree where
embed = embedG
toList :: MyTree -> [Int]
toList = cataG $ case_
( match @"Leaf" (\n -> [n])
|. match @"Node" (\(ns, ms) -> ns ++ ms)
)
main :: IO ()
main = print (toList (Node (Leaf 0) (Node (Leaf 1) (Leaf 2))))
-- Output: [0,1,2]