2017-01-02 13 views
3

Slicing Itに、Conor McBrideはインデックス付きファンクタを開発し、その合計と製品をスライド「Sum and Product」(スライドのラベルは表示されず、プレゼンテーションの約90%)に表示します。このスライドは、特にインデックス付きファンクタの合計

-- sum - choose between compatible structures 
data (:+:) :: (i ->- o) -> (i ->- o) -> (i ->- o) where 
    L :: s x :-> (s :+: t) x 
    R :: t x :-> (s :+: t) x 
instance (IFunctor s, IFunctor t) => IFunctor (s :+: t) where 
    imap f (L sx) = L (imap f sx) 
    imap f (R tx) = R (imap f tx) 

を開始し、:+:のこの定義は、両方のインデックス付きファンクタが同じソースインデックスiを有することを必要とします。なぜこれが当てはまるのだろうか。これは、例えば緩和することができる。

-- sum - choose between compatible structures 
data (:+:) :: (i ->- o) -> (j ->- o) -> (Either i j ->- o) where 
    L :: s x :-> (s :+: t) x 
    R :: t x :-> (s :+: t) x 

どこijが可能になりましたさまざまな種類がありますか?

+2

のように、型引数の代替(つまり、Either)を使用した場合、私の提案はうまくいくと思います。私は 'L :: s x - >(s:+:t)( 'Left x)'を期待しています – chi

+0

@chiそれは質問者が探している答えだと思います。 –

+5

簡単な答えは、統一版は「選択」を「再索引付け」とは別に保つことです。提案されたものは*特定の*再索引付けであり、容易にコード化することができます。 (ちなみに、chiは間違いがありますが、入力インデックスの代わりに出力インデックスを修正していると思います)。私は後で適切な答えを書くようにしますが、実行しなければなりません。 – pigworker

答えて

0

@chiあなたのポインタをありがとう。私が間違っていたことが判明 - 私の提案はうまくいかず、異なる入力を組み合わせることはできません。

data (:+:) :: (i ->- o) -> (i ->- u) -> (i ->- Either o u) where 
    L :: s x o -> (s :+: t) x ('Left o) 
    R :: t x u -> (s :+: t) x ('Right u) 

:+:両方とスライド上の:*:タイプ、すなわち、本質的に、引数として引数のペアを2種類を取る:しかし、推奨さ@chiコンストラクタにつながる、出力種類のEitherを使用することが可能です。

data (:|:) :: Either (i ->- o) (j ->- o) -> (Either i j ->- o) 
関連する問題