2016-03-30 18 views
-1

haskellでこのモナドのバインドを定義しようとしています。 計算が成功すると、それはSCont継続を呼び出し、失敗した場合はFCont継続を呼び出します。定義あなたハスケルの二重連続モダドでバインドを定義する

+0

型付き穴を試しましたか?あなたはどこに迷惑をかけましたか? – dfeuer

+2

裸のシノニムには「バインド」を定義することはできません。あなたはそれを新しいタイプにして、それをMonadのインスタンスと宣言する必要があります。 –

+1

また、なぜ単に 'Answer'の代わりに'() - > Answer'をしたいのですが、とにかく 'Answer'は何ですか? – dfeuer

答えて

1

は(XM >> = f)はKS KF = XM、

を手助けしようとしているに感謝し、それを考え出しましたSContは私には奇妙です。成功した継続はどのようにして失敗に終わりますか?さらに、returnbindを指定すると、失敗のように見えるが、コールツリーの途中までスレッドされている。あなたが戻り値をヒットした場合の成功に適用される。

私は「二連継続モナド」を期待

はそうのように定義する:

module SFCont where 

import Control.Monad 

newtype SFCont r a = SFCont { sfCont :: SCont r a -> FCont r a -> r } 
type SCont r a = a -> r 
type FCont r a = r 

instance Functor (SFCont r) where 
    fmap f (SFCont c) = SFCont $ \ ks -> c (ks . f) 

-- this will be obtained from the definition of the `Monad` instance 
instance Applicative (SFCont r) where 
    pure = return 
    (<*>) = ap 

instance Monad (SFCont r) where 
    return a = SFCont $ const . ($ a) 
    m >>= f = SFCont $ \ ks kf -> sfCont m (\ a -> sfCont (f a) ks kf) kf 

我々は障害がエラーの種類の要素を取ることができ、それ(とそのいとこを定義する体系的な方法を見つけることができますe)同型までの推論とその気づきによって:

SCont r a -> FCont r a -> r ~{ unfolding SCont, FCont } 
(a -> r) -> r -> r    ~{ r iso (() -> r) } 
(a -> r) -> (() -> r) -> r  ~{ uncurrying } 
((a -> r), (() -> r)) -> r  ~{ ((a -> r), (b -> r)) iso (Either a b -> r) } 
(Either a() -> r) -> r  ~{ Either a() iso Maybe a } 
(Maybe a -> r) -> r   ~{ folding MaybeT, Cont } 
MaybeT (Cont r) a    

とし、今、私たちは、このISOを書き留めることにより、既存のインスタンスを活用することができます

エラー継続タイプの要素がエラータイプeになる可能性がある場合は、同じプロセスに従い、isoのスタックEitherT e (Cont r) aに到着します。

1

KF - ( '> FA KS F' \ AF)

type M a = SCont a -> FCont -> Answer 
type SCont a = a -> FCont -> Answer 
type FCont =() -> Answer 

result :: a -> M a 
result x ks kf = ks x kf 

(>>=) :: M a -> (a -> M b) -> M b 
関連する問題