Катаморфизм и обход дерева в Haskell

Я нетерпелив, с нетерпением жду понимания катаморфизма , связанного с этим вопросом 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}, а не наоборот

Любые разъяснения от вас будут действительно приветствоваться.

15
задан Community 23 May 2017 в 11:47
поделиться