私の前の質問から、私はいくつかのモナディックコードを考え出そうとしてきました。まず、私が使用しているステートマシン関数は次のとおりです。
import Control.Monad
import Control.Monad.Error
newtype FSM m = FSM { unFSM :: String -> m (String, FSM m) }
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- unFSM f r
liftM (xs:) (fsm f' rs)
さて、これはうまくコンパイルされます:
exclaim :: (Monad m) => FSM m
exclaim = FSM exclaim'
exclaim' xs = return (xs ++ "!", exclaim)
しかし、型宣言のため、これはそうではありません。
question :: (MonadError String m) => FSM m
question = FSM question'
question' xs
| last xs == '?' = throwError "Already a question"
| otherwise = return (xs ++ "?", question)
エラーは、後Non type-variable argument
を参照していると思います。型宣言を削除すると、代わりに取得します。FlexibleContextsを有効にすると、これが「修正」されることは理解していますが、エラーをスローできるようにするために、もっと簡単な方法がありますか?あらゆる種類のコンパイラ拡張機能を有効にしたくはありません。String
MonadError
Could not deduce
ここに完全なコード。