Я нетерпелив, с нетерпением жду понимания катаморфизма связанного с этим вопросом SO:)
Я только практиковал начало учебника Real World Haskell. Итак, может быть, я сейчас попробую слишком много, если это так, просто скажите мне те понятия, которые я должен изучить.
Ниже я цитирую образец кода википедии для катаморфизма.
Я хотел бы узнать ваше мнение о foldTree ниже, способ пересечения дерева, по сравнению с этим другим вопросом и ответом SO, также касающийся пересечения дерева n-arry обход. (независимо от того, чтобы быть двоичным или нет, я думаю, что катаморфизм ниже может быть написан так, чтобы управлять 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 [email protected](TreeAlgebra {leaf = f}) (Leaf x ) = f x
foldTree [email protected](TreeAlgebra {branch = g}) (Branch l r) = g (foldTree a l) (foldTree a r)
В этот момент у меня много трудностей, я, кажется, догадываюсь, что лист морфизма
будет применяться к любому Листу
Но чтобы использовать этот код для реального, foldTree нужно кормить определенной TreeAlgebra,
TreeAlgebra, которая имеет определенный лист морфизма, чтобы что-то сделать?
но в этом случае в коде foldTree я ожидал бы {f = leaf}, а не наоборот
Любые разъяснения от вас были бы очень желанными.