私はExpr型の値をTermに変換するのに役立つモナド関数を持っています。署名は、私はトラブルが一般的であるケースを処理する必要がありアイテムリストのモナディック表現を一般化する
fromDM :: (Name -> CompilerM Term) -> Expr -> CompilerM Term
です。私は今、私は一般的なルール、すなわちTuple es
でこれを代用したい
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
すべての個々のソリューションの実装を書き留めることができます。私はこれがfoldlM
またはfoldrM
のいずれかで実行可能でなければならないと感じています。しかし、私はこれをどうやってやり遂げるのかちょっと固まっています。だから、どのように表現の任意のリストで動作するこの変換の一般的なルールを書くのですか?
[withCStringのような連鎖機能に方法はありますか?]の可能な重複(http://stackoverflow.com/questions/37379984/is-there-a-way-to-chain-functions-like- withcstring) – Cactus
その質問はどのように重複していますか?私は残念なことに、そこにある質問や答えに自分の質問をマッピングすることはできません。 – wirrbel
関連する種類に関する詳細情報が役立ちます。 – chepner