2013-09-21 76 views
3

如何從FreeMonadFree創建Arrow來自Free和MonadFree的箭頭

class (Functor f, Monad m) => MonadFree f m where ... 

data Free f a = Impure (f (Free f a)) | Pure a 

MonadFree包含2個參數mf,但Kleisli沒有空間插入f,所以我們不能用Kleisli箭頭,MonadFree

據我瞭解,它是需要創建一個類,一個NEWTYPE和實例,像這樣的:

class Arrow a => ArrowFunctor f a | a -> f where 
    afmap :: a b (f c) 

newtype FKleisli f m a b = FKleisli { runFKleisli :: a -> f (m b) } 

instance (Functor f, Monad m, MonadFree f m) => 
     ArrowFunctor (FKleisli f m a) where ... 

但它看起來像執行不繁瑣

+3

你試過'Kleisli(FreeT f m)'嗎? –

+0

不錯!我會試試看! – wit

+0

@SjoerdVisscher你想寫這個答案嗎? – AndrewC

回答

1

如果m'是一個實例Monad,然後Kleisli m'Arrow(和一堆其他相關類型類似ArrowApply)的實例。

在你的情況,你要使用FreeT f m作爲底層的單子(對於某些Functor fMonad m),所以你可以只設置m'FreeT f m,準確地得到你想要的:Kleisli (FreeT f m)