2017-10-09 5 views
3

Bifunctorを使用している場合は、firstsecond「マップ」機能にアクセスできます。ですから、基本的にはFunctorで、fmapの2つの異なる方法があります。Bifunctorに相当するMonoidはありますか?

Monoidのようなものがありますか? 2つの異なる方法で追加できる概念

たとえば、不透明な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'に似た2つの異なるインスタンスであると思います。 – 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

私はあなたがインデックス付きモノイドでこのような何かを行うことができると思います:

{-# 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) 

(あなたが一緒に4つのブロックを配置する際のアイデンティティ、結合性、可換性)あなたは法律の束を期待したいです。インデックスは問題ではない1:インデックス付きモノイドの簡単な例

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

本当にこのソリューションが大好きです!しかし実際には、私はこれが私が直面している問題のために過度のことだと思います。どうもありがとうございました :) –

関連する問題