Я нетерпелив, с нетерпением жду понимания катаморфизма , связанного с этим вопросом SO :)
Я практиковал только начало Реального Учебник по World Haskell. Так что, может быть, я собираюсь попросить слишком многого прямо сейчас, если бы это было так, просто расскажите мне концепции, которые мне следует изучить.
Ниже, Я цитирую пример кода википедии для катаморфизма .
Я хотел бы узнать ваше мнение о foldTree ниже, способе обхода Дерева, по сравнению с этим другим вопросом и ответом SO, также имеющим отношение к обходу Дерево n-арный обход дерева . (независимо от того, является ли он двоичным или нет, я думаю, что приведенный ниже катаморфизм может быть написан так, чтобы управлять n-арным деревом)
Я комментирую то, что я понимаю, и буду рад, если вы сможете исправить меня и уточнить некоторые вещи.
{-this is a binary tree definition-}
data Tree a = Leaf a
| Branch (Tree a) (Tree a)
{-I dont understand the structure between{}
however it defines two morphisms, leaf and branch
leaf take an a and returns an r, branch takes two r and returns an r-}
data TreeAlgebra a r = TreeAlgebra { leaf :: a -> r
, branch :: r -> r -> r }
{- foldTree is a morphism that takes: a TreeAlgebra for Tree a with result r, a Tree a
and returns an r -}
foldTree :: TreeAlgebra a r -> Tree a -> r
foldTree a@(TreeAlgebra {leaf = f}) (Leaf x ) = f x
foldTree a@(TreeAlgebra {branch = g}) (Branch l r) = g (foldTree a l) (foldTree a r)
на данный момент у меня много трудностей, я думаю, что лист морфизма также имеет дело с обходом дерева n-арным обходом дерева . (независимо от того, является ли он двоичным или нет, я думаю, что приведенный ниже катаморфизм может быть написан так, чтобы управлять n-арным деревом)
Я комментирую то, что понимаю, и буду рад, если вы могли бы исправить меня и уточнить некоторые вещи.
{-this is a binary tree definition-}
data Tree a = Leaf a
| Branch (Tree a) (Tree a)
{-I dont understand the structure between{}
however it defines two morphisms, leaf and branch
leaf take an a and returns an r, branch takes two r and returns an r-}
data TreeAlgebra a r = TreeAlgebra { leaf :: a -> r
, branch :: r -> r -> r }
{- foldTree is a morphism that takes: a TreeAlgebra for Tree a with result r, a Tree a
and returns an r -}
foldTree :: TreeAlgebra a r -> Tree a -> r
foldTree a@(TreeAlgebra {leaf = f}) (Leaf x ) = f x
foldTree a@(TreeAlgebra {branch = g}) (Branch l r) = g (foldTree a l) (foldTree a r)
на данный момент у меня много трудностей, я думаю, что лист морфизма также имеет дело с обходом дерева n-арным обходом дерева . (независимо от того, является ли он двоичным или нет, я думаю, что приведенный ниже катаморфизм может быть написан так, чтобы управлять n-арным деревом)
Я комментирую то, что понимаю, и буду рад, если вы могли бы исправить меня и уточнить некоторые вещи.
{-this is a binary tree definition-}
data Tree a = Leaf a
| Branch (Tree a) (Tree a)
{-I dont understand the structure between{}
however it defines two morphisms, leaf and branch
leaf take an a and returns an r, branch takes two r and returns an r-}
data TreeAlgebra a r = TreeAlgebra { leaf :: a -> r
, branch :: r -> r -> r }
{- foldTree is a morphism that takes: a TreeAlgebra for Tree a with result r, a Tree a
and returns an r -}
foldTree :: TreeAlgebra a r -> Tree a -> r
foldTree a@(TreeAlgebra {leaf = f}) (Leaf x ) = f x
foldTree a@(TreeAlgebra {branch = g}) (Branch l r) = g (foldTree a l) (foldTree a r)
на данный момент у меня много трудностей, я думаю, что лист морфизма
будет применяться к любому листу
Но для того, чтобы использовать этот код по-настоящему, в foldTree необходимо передать определенную TreeAlgebra,
TreeAlgebra, у которого есть определенный лист морфизма, чтобы что-то делать?
но в этом случае в коде foldTree я ожидал бы {f = leaf}, а не наоборот
Любые разъяснения от вас будут действительно приветствоваться.