Oℕ
Size: a a a
Oℕ
Oℕ
NI
λ
AG
λ
OP
OP
foldl`/`foldr
- это катаморфизм для []
- как это понять?f
?Fix f
? наверное []
f a -> a
к
newtype Fix f = Fix
{ unFix :: f (Fix f) }
cata :: Functor f => (f a -> a) -> Fix f -> a
cata f = go where
go = f . fmap go . unFix
data ListF b = NilF | ConsF a b
deriving (Functor)
type List a = Fix (ListF a)
lengthAlg :: ListF a Int -> Int
lengthAlg NilF = 0
lengthAlg (ConsF _ l) = l + 1
length :: List a -> Int
length = cata lengthAlg
VY
data List a = Nil | Cons a (List a) превращается в
data List t r = Nil | Cons t r
data Tree a = Leaf a | Node (Tree a) (Tree a) -- превращается в
data Tree a t = Leaf a | Node t t
data L t r = Nil | Cons t r
type List t = Fix (L t)
data T a t = Leaf a | Node t t
type Tree a = Fix (T a)
OP
OP
[]
?OP
к
data ListF b = NilF | ConsF a b
deriving (Functor)
type List a = Fix (ListF a)
nil :: List a
nil = Fix NilF
cons :: a -> List a -> List a
cons a b = Fix (ConsF a b)
к
VY
data [] a = [] | a : [a]
OP
data [] a = [] | a : [a]
OP
unFix
?Oℕ
unFix
?