2016-07-25 7 views
1

洗練型のシステムを実装する際に、型が整形式であることを確認する必要があります。たとえば、Num[100,0]のようなタイプは発生しません.は、lbより大きく、ubより小さい数字のタイプです。私は、書いた:「restricted Monad」の既知の問題に私を得たモナドを使用して洗練された型の整形式を暗黙にチェックする

-- FORMATION RULES 

class RefTy t 
    where tyOK :: t -> Bool 

instance RefTy Ty 
    where tyOK (NumTy (n1, n2)) = n1 <= n2 
     tyOK (CatTy cs) = isSet cs 

{- 
data WellFormed t = Valid t 
        | Invalid 

instance Monad WellFormed 
    where 
    (>>=) :: RefTy a => WellFormed a -> (a -> WellFormed b) -> WellFormed b 
    Valid t >>= f 
      | tyOK t = f t 
      | otherwise = Invalid 
    Invalid >>= _ = Invalid 
-} 

を。提案された答えは、Wellformedモナドを一般的にするが、機能を制限することである。しかし、それはどこにでも整形された小切手を加えることに戻るだろう。周りを回る良い方法はありますか?

+0

そして、どのように定義する 'return'ようなものを書くことができるだろう/ '純粋な'? – Alec

答えて

4

あなたのケースでは、私はあなたが実際にモナドを望んでいないと思う、ちょうどdo表記に伴う砂糖。たとえば、Applicativeの定義がどのように見えるか考えましたか?あなたがこれを通ってあなたの方法を欺くしようとすると、ものすごく速くなる。

あなたがdo -notationを使用したい場合は代わりに、私はあなたが、他のものの中で、doブロックを脱糖に使用(>>=)returnを再定義することができます

{-# LANGUAGE RebindableSyntax #-} 

を使用することをお勧め。その後、何か書くことができます:私は、私はそれらの定義に同意するか分からない

myBind :: RefTy t1 => WellFormed t1 -> (t1 -> WellFormed t2) -> WellFormed t2 
myBind Invalid _ = Invalid 
myBind (Valid t) f | tyOK t = f t 
        | otherwise Invalid 

myReturn :: WellFormed t 
myReturn t = Valid t 

を、関係なく、あなたがして

do 
    ... 
    where (>>=) = myBind 
     return = myReturn 
関連する問題