Bei der Implementierung eines Verfeinerungssystems muss ich sicherstellen, dass die Typen wohlgeformt sind. Zum Beispiel sollte ein Typ wie Num[100,0]
nicht passieren, wobei Num[lb,ub]
die Art der Zahlen größer als lb
und kleiner als ub
ist. Ich schrieb dann:Verwendung einer Monade zur impliziten Überprüfung der Verfeinerungsart Wohlgeformtheit
-- 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
-}
Was mich in das bekannte Problem der "restricted Monad" bekam. Die vorgeschlagene Antwort ist die Wellformed
Monade, um allgemein zu sein, aber die Funktionen einzuschränken. Das würde jedoch dazu führen, dass überall der wohlgeformte Scheck hinzugefügt wird. Gibt es einen besseren Weg, um herumzukommen?
zu schreiben Und wie würden Sie definieren 'return'/'rein'? – Alec