7

私は最近、インデックス付きのモナドを見ています(そして理解しようとしています)。ここで説明するように、インデックス付きモナドの1つのスタイルに頭を悩ませていると思います:A Neighborhood of Infinity:BeyondMonads

ただし、index-coreで別のスタイルのインデックス付きモナドを見つけました。これには、2つのインデックスを持つこのインデックス付きモナドバインドに対応するように見える部分がいくつかあります。たとえば、同様のバインド演算子!>=。明らかにインデックスに同様の変更が加えられていますが、たとえば、他のスタイルと同様に継続モナドの戻り型を制御するために、これらのインデックスを使用する方法を完全に理解することはできません。私はこのスタイルのインデックス付きモナドに興味があります。これは主に、モナド変換子の方がはるかにうまく機能するように見えるためです。実際、他のスタイルで定義された(インデックス付きモナドの)インデックス付きモナド変換子は見たことがありません。通常のモナド。

このスタイルの継続モナドとして実装された2つの結果タイプの継続モナドの例を誰かが提供できるかどうか、またはこのモジュールを使用して2つのインデックスを使用する他のインデックス付きモナドを定義する他の例を教えてください(たとえば、状態のタイプが変更される可能性のある状態モナドの形式)。私はそのような例を探していましたが、運が悪かったのですが、自分でうまく実装することができませんでした。当たり前のことだと思いますが、さまざまなコンストラクターに少し縛られています。

4

1 に答える 1

9

私はindex-coreパッケージの作者です、そして答えはあなたができるということです。解決策は次のとおりです。

{-# LANGUAGE TypeOperators, RankNTypes #-}

import Control.Category.Index
import Control.IMonad
import Data.Functor.Identity

newtype ICont f a i = ICont { runICont :: (a :-> f) -> f i }

fの代わりに使用することに注意してくださいr。はrインデックスになります。

IFunctorおよびの実装IMonadは、通常のモナドの実装と同じです(ブログ投稿のバージョンと同じです)。

instance IFunctor (ICont f) where
    fmapI f m = bindI (returnI . f) m

instance IMonad (ICont f) where
    returnI a = ICont $ \k -> k a
    bindI f m = ICont $ \k -> runICont m $ \a -> runICont (f a) k

秘訣は、ブログ投稿で見たバージョンに還元されることを理解することです。f = Identity

  (a -> r2) -> r1
~ (a -> Identity r2) -> Identity r1
~ ((a := r2) r2 -> Identity r2) -> Identity r1
~ ((a := r2) :-> Identity) -> Identity r1
~ ICont Identity (a := r2) r1
~ R ICont Identity r1 r2 a

唯一の違いは、余分なノイズRIdentityノイズです。ブログ投稿のバージョンと一致させることを選択した場合は、これらを抽象化できます。

type ICont' r1 r2 a = ICont Identity (a := r2) r1

これは、を使用して記述された関数の例です。ICont

-- example ~ (String -> Int) -> Char
-- example ~ ((String := Int) Int -> Identity Int) -> Identity Char
example :: ICont' Char Int String
example = ICont $ \k -> Identity $
    case runIdentity (k (V "Hello")) of
        0 -> 'A'
        _ -> 'B'

ライブラリは、コナー・マクブリッジの論文「とんでもない幸運のクライスリの矢」index-core触発されました。Conorのアプローチでは、ブログ投稿のアプローチよりも詳細度が必要ですが、主に、より強力な情報をインデックスに格納してさらに柔軟性を高める機能など、ブログ投稿のアプローチにはない追加機能が提供されます。

つまり、これらの追加機能が必要ない場合は、ブログ投稿で見たものを使用する必要があります。ただし、コナーの論文は非常に優れた論文であり、ハスケルの型システムがいかに強力であるかを示しているため、何を選択しても読むことを強くお勧めします。

のインデックス付きモナドは実装しませんでしたindex-core。主な理由は、自分が作成した別のライブラリのかゆみを掻くためにそのライブラリを作成したためです。を使用する具体的なコードを確認したい場合は、インデックス付きの無料モナド変換子を実装するために使用したパッケージのindex-coreバージョン2.2.0を確認してください。しかし、私はまだパッケージを維持していますが、そのタイプはもう使用していません。pipesindex-coreindex-core

他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-12-24T14:52:28.800 に答える