2017-10-09 13 views
3

Bifunctor으로 작업 할 때 firstsecond "지도"기능에 액세스 할 수 있습니다. 기본적으로 Functorfmap의 두 가지 방식으로 허용합니다.Bifunctor에 해당하는 Monoid가 있습니까?

Monoid에는 어떤 것이 있나요? 우리가 두 가지 다른 방식으로 추가 할 수있게 해주는 개념?

예를 들어, 불투명 한 Matrix 유형을 상상해보십시오. 목록 또는 벡터 벡터 목록이 아니기 때문에 내부적으로 어떻게 구조화되어 있는지 알지 못하지만 행과 열을 추가 할 수 있다는 것을 알고 있습니다.

이 작업을 수행 할 수있는 일부 유형 클래스가 있습니까?

class X a where 
    firstAppend :: a -> a -> a 
    secondAppend :: a -> a -> a 

instance X Matrix where 
    firstAppend = appendRow 
    secondAppend = appendColumn 
+3

가 난 아무것도 표준의 인식 정의 아니에요 . 당신은 확실히 그것을 스스로 정의 할 수 있습니다. 유형 수준에서는 차별화 할 것이 없기 때문에 가치에 대해서는 잘 모르겠습니다. 더 적절한 해결책은'newtype' 래퍼와'Data.Monoid'의'Product'와'Sum'과 비슷한 두 개의 다른 인스턴스가 될 것이라고 생각합니다. – ryachza

+0

예 @ryachza 더 적절한 해결책이 될 수 있다고 생각합니다. –

+0

이것은 정기적으로 임시 방편으로 수행됩니다 (예 : [다이어그램에서] (http://hackage.haskell.org/package/diagrams-lib-1.4.1.2/docs/Diagrams-TwoD-Combinators.html#v:-61--61--61-), [matrix ] (http://hackage.haskell.org/package/matrix-0.3.5.0/docs/Data-Matrix.html#g:9) 또는 [hmatrix] (http://hackage.haskell.org/package/hmatrix) -0.18.1.0/docs/Numeric-LinearAlgebra-Data.html # g : 12). – leftaroundabout

답변

2

나는 당신이 인덱스 Monoids과 같은 것을 할 수있는 것 같아요 : (당신이 함께 4 개 블록을 넣을 때 정체성, 연관성, 교환 법칙)

{-# LANGUAGE PolyKinds  #-} 
{-# LANGUAGE KindSignatures #-} 
{-# LANGUAGE TypeFamilies #-} 

module IndexedMonoids where 

class MonoidIx (m :: k -> *) where 
    type Null m :: k 
    type Mult m (i :: k) (j :: k) :: k 

    nullIx :: m (Null m) 
    multIx :: m i -> m j -> m (Mult m i j) 

class MonoidIx2 (m :: k -> l -> *) where 
    type Null1 m :: k 
    type Null2 m :: l 
    type Mult1 m (i :: k) (j :: k) :: k 
    type Mult2 m (p :: l) (q :: l) :: l 

    null1Ix :: m (Null1 m) p 
    null2Ix :: m i (Null2 m) 
    mult1Ix :: m i p -> m j p -> m (Mult1 m i j) p 
    mult2Ix :: m i p -> m i q -> m i (Mult2 m p q) 

당신은 법률의 무리를 기대. 인덱스 모노 이드의 사소한 예 : 인덱스가 문제가되지 않는 하나

newtype Dummy (m :: *) (i :: k) = Dummy { getDummy :: m } 

instance Monoid m => MonoidIx (Dummy m :: * -> *) where 
    type Null (Dummy m)  =() 
    type Mult (Dummy m) i j =() 

    nullIx = Dummy mempty 
    multIx (Dummy i) (Dummy j) = Dummy $ mappend i j 
난 당신이 행렬의 인스턴스를 구현 드리겠습니다

)

+0

정말이 솔루션을 좋아합니다! 그러나 실제로 이것은 제가 직면하고있는 문제에 대한 과잉이라고 생각합니다. 고마워요 :) –