モードのリストを保持するステートモナドが欲しいのですが。
data State = S {
modes :: [Mode]
}
ただし、2つの要件があります。
- モードはタイプでパラメータ化する必要があります。
- モードは実行時に構築できます。
これが私がGHCを説得しようとした方法です:
試行1、データ型を使用
data Mode a = Mode {
complF :: String -> IO [String]
action :: State -> String -> X a
}
data State a = S {
modes :: [Mode a]
}
initState :: (String -> IO [String]) -> (State -> String -> X a) -> State a
initState c a = {
modes = [buildMode c a]
}
buildMode :: (String -> IO [String]) -> (State -> String -> X a) -> Mode a
buildMode c a = {
complF = c
, action = a
}
良い..しかし、すべてのモードは。Mode a
内のタイプでなければならないので、これは私には役に立ちませんState a
。Mode String
いいえ、Mode ()
州内で共存できることを意味します。
試行2:、型クラス
class Mode a where
complF :: String -> IO [String]
action :: State -> String -> X a
data State = S {
modes :: (Mode a) => [a]
}
complF
しかし、今は与えられた実行時間でモードを構築する方法がわかりませんaction
。型クラスのインスタンスはコンパイル時に定義する必要があるようです。
instance Mode DefaultMode where
complF :: ..
action :: ..
回避策はありますか?