haskellでこのモナドのバインドを定義しようとしています。 計算が成功すると、それはSCont継続を呼び出し、失敗した場合はFCont継続を呼び出します。定義あなたハスケルの二重連続モダドでバインドを定義する
-1
A
答えて
1
は(XM >> = f)はKS KF = XM、
を手助けしようとしているに感謝し、それを考え出しましたSCont
は私には奇妙です。成功した継続はどのようにして失敗に終わりますか?さらに、return
とbind
を指定すると、失敗のように見えるが、コールツリーの途中までスレッドされている。あなたが戻り値をヒットした場合の成功に適用される。
はそうのように定義する:
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
関連する問題
- 1. 全二重HTTP接続
型付き穴を試しましたか?あなたはどこに迷惑をかけましたか? – dfeuer
裸のシノニムには「バインド」を定義することはできません。あなたはそれを新しいタイプにして、それをMonadのインスタンスと宣言する必要があります。 –
また、なぜ単に 'Answer'の代わりに'() - > Answer'をしたいのですが、とにかく 'Answer'は何ですか? – dfeuer