Purescript で Reader モナドをいじっていたところ、奇妙な動作に遭遇しました。このモナドを理解していないからなのか、それとも他の何かが欠けているからなのかはわかりません。
これは私のコードです:
type Level = Number
type Doc = Reader Level String
renderLine :: String -> Level -> String
renderLine s 0 = s
renderLine s l = "\t" ++ (renderLine s (l - 1))
line :: String -> Doc
line s = do
level <- ask
return (renderLine s level)
これは問題なく、コンパイルされます。それにもかかわらず、これの前に、次のような関数行でより簡単なことを試しました:
line :: String -> Doc
line s = do
level <- ask
return "Hello Reader monad"
(renderLine s level) と "Hello Reader モナド" が同じ型であるにも関わらず、コンパイルされません。このエラーがスローされます:「Control.Monad.Reader.Class.MonadReader u14555(Control.Monad.Reader.Trans.ReaderT Prim.Number Control.Monad.Identity.Identity)のインスタンスが見つかりません」
私は何かが欠けていると確信していますが、何がわかりません。