카테고리 이론에서 monad은 두 개의 adjoint 펑터의 구성입니다. 예를 들어 Maybe 모나드는 잊혀진 펑터로 구성된 무료 첨자 세트 펑터입니다. 마찬가지로, List 모나드는 잊혀진 functor로 구성된 무료 monoid functor입니다.자유 그룹 모나
모노 노이드는 가장 간단한 대수 구조 중 하나입니다. 그래서 프로그래밍이 더 복잡한 것들로부터 이익을 얻을 수 있는지 궁금합니다. 나는 표준 하스켈 패키지에서 무료로 그룹 모나드를 찾지 못했습니다, 그래서 나는
data FreeGroup a = Nil | PosCons a (FreeGroup a) | NegCons a (FreeGroup a)
==
운영자
NegCons x (PosCons x y) == y
하도록 정의 여기를 정의 할 수 있습니다. 따라서
length :: FreeGroup a -> Int
에서 각
PosCons
은 +1로 계산되고 각 숫자는
NegCons
-1입니다 (이는 각 PosCons에서 +1 값을 갖는 Int의 유일한 그룹 모프입니다).
목록 (무료 monoids)에서와 같이 concat
은 곱셈이며 map
은 재미있는 함수입니다. 따라서 FreeGroup
의 모나드 인스턴스는 List
의 모나드 인스턴스와 정확히 같습니다.
무료 그룹 모나드는 프로그래밍 용도로 사용됩니까? 또한 종종 모나드를 컨텍스트에서 값으로 해석하는 경우가 있습니다. List
의 경우 컨텍스트는 선택 또는 불확실성입니다. 자유 집단 모나드에 대한 그러한 해석이 있습니까?
무료 링 및 벡터 공간은 언제나 무료입니다.
foldS :: S s => (a -> s) -> FS a -> s
그것은 자유 물체상의 S
-morphism에 기초 a
에 함수 리프트 : 모두 대수적 구조 S
들어
FS :: Set -> S
존재 하스켈 폴드 호출 기능의 존재를 의미
FS a
. 보통
foldr
함수는
foldMonoid
(하스켈에서
foldMap
이라고 불리는 이유는 무엇인가)의 특수화이며, monoid는 곱셈과 같은 조합으로 구성된 함수 집합
b -> b
입니다. 완성도를 위해서
, 여기
FreeGroup
의 모나드 인스턴스 : "자유 그룹 모나드가 어떤 프로그래밍 사용이 있습니까"
mult :: FreeGroup a -> FreeGroup a -> FreeGroup a
mult Nil x = x
mult x Nil = x
mult (PosCons x y) z = PosCons x (mult y z)
mult (NegCons x y) z = NegCons x (mult y z)
inverse :: FreeGroup a -> FreeGroup a
inverse Nil = Nil
inverse (PosCons x y) = mult (inverse y) (NegCons x Nil)
inverse (NegCons x y) = mult (inverse y) (PosCons x Nil)
groupConcat :: FreeGroup (FreeGroup a) -> FreeGroup a
groupConcat Nil = Nil
groupConcat (PosCons x l) = mult x (groupConcat l)
groupConcat (NegCons x l) = mult (inverse x) (groupConcat l)
instance Functor FreeGroup where
fmap f Nil = Nil
fmap f (PosCons x y) = PosCons (f x) (fmap f y)
fmap f (NegCons x y) = NegCons (f x) (fmap f y)
instance Applicative FreeGroup where
pure x = PosCons x Nil
fs <*> xs = do { f <- fs; x <- xs; return $ f x; }
instance Monad FreeGroup where
l >>= f = groupConcat $ fmap f l
'NegCons x (PosCons x y) == y'를 정의하려면'FreeGroup a'에서'a'를위한'Eq' 인스턴스가 필요합니다. 당신은 그것을 강요 할 수 없습니다. 'FreeGroup'이 haskell의 모나드라고 생각하지 않습니다. – Franky
목록의 경우도 같습니다 :'instance Eq a => Eq [a]'. 모나드 정의에는'=='연산자가 필요하지 않습니다. 단지'PosCons'와'NegCons' 사이의 링크를 설명하는 것입니다. –
'Monad'에 대해 타입 인자에 "접근"할 수 없기 때문에 주석에 여러분이 준 예제에서와 같이'Eq' 제약 조건을 가질 수 없습니다. 인스턴스 Monad FreeGroup에'Eq' 제약 조건을 넣을 수 없습니다. Monad 인스턴스를 정상적인 형태로 두지 않으면 평등을 피할 수 있다면이 방법이 효과가있을 것입니다. –