-8

パターンとコンストラクターの「主な」違いは何ですか?

答え:

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.
4

2 に答える 2

7

ダニエル・フィッシャーが言ったように、コンストラクターは何らかの価値を構築し、パターンはそれを分解します。

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 

これは単なる例であることに注意してください。この特定のタイプでは、レコード構文の方が適切です。

于 2012-12-28T12:54:40.957 に答える
5

ある意味では、それらは二重であるため、互いに非常に似ています。コンストラクターは、データ型のシグネチャ ファンクターの代数と考えることができ、同じファンクターの合体をパターン化します。

より明確にするために、考えてみましょう[]。その署名関手はT_A X = 1 + A * Xor であり、Haskell では

type ListF a x = Maybe (a, x)

明白なFunctor例で。キャリアListFを持つ代数は単なるコンストラクタであることがわかりますList

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

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

二重に、そのキャリアとしてのcoalgebraを見ることができListFますList

type Coalgebra f a = a -> f a

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

さらに、安全なバージョンのheadtailが非常に自然なデストラクタであることを確認します。[]

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

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

これは個人的なペットの不満を煽り、部分性を無視して特に優れた関数でさえheadありtailません---それらは署名 functor を持つ無限リストでのみ自然ですT A X = A*X

Haskell では、ファンクターの最初Algebraと最後Coalgebraがそのファンクターの固定小数点として一致します。

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

これはまさにデータ型です。[a]が同形であることを証明できます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

これにより、データ型自体をコンストラクターとパターンの両方として使用する正当な理由が得られますが、他の種類の「coalgebra のような」ものを作成すると、Sheパターン コンビネーターによって提供されるような第一級のパターンを持つことができます。

パターンとコンストラクターの二重性をより深く理解するには、上記の演習を次のようなデータ型でもう一度実行してみてください。

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

その署名関手はT A X = 1 + X*A*Xor

type TreeF a x = Maybe (x,a,x)
于 2013-11-09T16:03:09.573 に答える