Какова «основная» разница между шаблонами и конструкторами - Haskell

Какова «основная» разница между шаблонами и конструкторами?

Ответ:

With a constructor you can add a tag to your data, in such a way that it receives a type.

Patters will be more used for matching data with a pattern, which isn't the case of a constructor. 
Patters can also be used for the destruction reasons.
8
nl ja de
Не могли бы вы уточнить свой вопрос? Я не уверен, на что вы нацеливаетесь, они предназначены для разных целей, конструктор строит значения, а шаблоны используются для разделения ценностей (в широком смысле).
добавлено автор Daniel Fischer, источник

2 ответы

Как сказал Даниэль Фишер, конструкторы создают некоторую ценность, а шаблоны выделяют это:

data Person = P String String Int

-- constructor to build a value
makePerson firstname lastname age = P firstname lastname age 

-- pattern to take a value apart
fullName (P firstname lastname _) = firstname ++ " " + lastname 

Обратите внимание, что это просто пример, для этого конкретного типа синтаксис записи будет более уместным.

7
добавлено

В некотором смысле они очень похожи друг на друга, поскольку они двойственны. Конструкторы можно рассматривать как алгебру сигнатурного функтора типа данных и шаблонов коалгебр на том же самом функторе.

Чтобы быть более явным, рассмотрим [] . Это функция подписи T_A X = 1 + A * X или, в Haskell

type ListF a x = Maybe (a, x)

с очевидным экземпляром Functor . Мы видим, что ListF -algebras с носителем List являются его конструкторами

-- general definition
type Algebra f a = f a -> a

consList :: Algebra (ListF a) [a]
consList Nothing        = []
consList (Just (a, as)) = a:as

Dually, мы можем посмотреть на коалгебру ListF с помощью List в качестве носителя

type Coalgebra f a = a -> f a

unconsList :: Coalgebra (ListF a) [a]
unconsList []     = Nothing
unconsList (a:as) = Just (a, as)

and further see that the safe versions of head and tail are very natural destructors on []

headMay :: [a] -> Maybe a
headMay = fmap fst . unconsList

tailMay :: [a] -> Maybe a
tailMay = fmap snd . unconsList

Это подпитывает личный питомец о head и tail , даже не являясь особенно приятными функциями, игнорируя их пристрастность - они естественны только в бесконечных списках, у которых есть функции-подписи TAX = A * X .

Теперь в Haskell начальная Algebra и конечная <кодовая> коалгебра функтора совпадают как неподвижная точка этого функтора

newtype Fix f = Fix { unfix :: f (Fix f) }

Which is exactly what data types are. We can prove that [a] is isomorphic to Fix (ListF a)

fwd :: [a] -> Fix (ListF a)
fwd []     = Fix Nothing
fwd (a:as) = Fix (Just (a, fwd as))

bwd :: Fix (ListF a) -> [a]
bwd (Fix Nothing)           = []
bwd (Fix (Just (a, fixed))) = a : bwd fixed

Это обеспечивает обоснование использования самого типа данных как для конструкторов, так и для шаблонов, но если вы создаете другие виды «коалгебра-подобных» вещей, то вы можете иметь первоклассные шаблоны, такие как те, которые предоставляются Он или комбинаторы моделей .

Для более глубокого понимания двойственности шаблонов и конструкторов попробуйте выполнить это упражнение выше, используя тип данных, например

data Tree a = Leaf | Branch (Tree a) a (Tree a)

Его сигнатурный функтор T A X = 1 + X * A * X или

type TreeF a x = Maybe (x,a,x)
5
добавлено
Haskell
Haskell
910 участник(ов)

https://combot.org/chat/-1001043143583 Ссылки на полезные ресурсы: https://ruhaskell.org/links.html ;