Ich habe eine monadische Funktion, die dabei hilft, Werte vom Typ Expr in Terms zu übersetzen. Die Signatur istVerallgemeinern eines monadischen Ausdrucks über eine Liste von Elementen
fromDM :: (Name -> CompilerM Term) -> Expr -> CompilerM Term
Ich habe Probleme in einem Fall im Allgemeinen zu behandeln. Ich kann Implementierungen für jede individuelle Lösung aufschreiben
import Control.Monad.State
type CompilerM = State Incr
newtype Incr = Incr Int deriving (Show)
generateNameM :: CompilerM Name
generateNameM = state $ \i ->
let Incr y = i
j = (+1) y
in (Name j, Incr j)
data Expr = Tuple [Expr]
data Name = Name Int
data Term = Let Name [Name] Term
fromDM :: (Name -> CompilerM Term) -> Expr -> CompilerM Term
fromDM k expr = case expr of
Tuple [e1, e2] -> do
x <- generateNameM
t' <- k x
fromDM (\z1 -> fromDM (\z2 -> pure $ Let x [z1, z2] t') e2) e1
Tuple [e1, e2, e3] -> do
x <- generateNameM
t' <- k x
fromDM (\z1 -> fromDM (\z2 -> fromDM (\z3 -> pure $ Let x [z1, z2, z3] t') e3) e2) e1
Tuple [e1, e2, e3, e4] -> do
x <- generateNameM
t' <- k x
fromDM (\z1 -> fromDM (\z2 -> fromDM (\z3 -> fromDM (\z4 -> return $ Let x [z1, z2, z3, z4] t') e4) e3) e2) e1
Jetzt möchte ich dies mit einer allgemeinen Regel ersetzen, das heißt Tuple es
. Ich denke, dass dies entweder mit foldlM
oder foldrM
möglich sein sollte. Aber ich bleibe irgendwie dabei, wie ich das mache. Also, wie schreibe ich eine allgemeine Regel für diese Transformation, die auf einer beliebigen Liste von Ausdrücken funktioniert?
Mögliche Duplikat [gibt es eine Möglichkeit, um Chain-Funktionen wie withCString?] (http://stackoverflow.com/questions/37379984/is-there-a-way-to-chain-functions-like- withcstring) – Cactus
Wie ist diese Frage ein Duplikat? Leider kann ich meine Frage nicht auf die Frage oder die Antworten da drüben abbilden. – wirrbel
Weitere Informationen über die beteiligten Typen wären hilfreich. – chepner