1

次の Haskell スニピットはコンパイルされず、その理由がわかりません。

runCompiler :: TC -> IO ()
runCompiler tc = let cp' = cp in 
    do 
        cp'
        return ()
    where
    cp = compileProg tc

GHCi から次のエラーが表示されます。

    Couldn't match expected type `IO a0' with actual type `String'
    In a stmt of a 'do' block: cp'
    In the expression:
      do { cp';
           return () }
    In the expression:
      let cp' = cp
      in
        do { cp';
             return () }

コンパイルするために何をすべきかについてのアイデア。与えられた最終値として () を受け入れない理由がわかりません。

4

1 に答える 1

12

do2 つのステートメントを順序付けする記法を使用する場合:

do
    action1
    action2

と同じですaction1 >> action2

>>Monad m => m a -> m b -> m bは bothaction1であり、action2モナド値でなければなりません。

compileProgあなたの関数は typeを持っているように見えますが、表記法で使用しているため、コンパイラはそれがいくつかのものであるTC -> Stringことを期待しています。TC -> IO aado

あなたが使用することができますlet

do 
    let _ = compileProg tc
    return ()

コンパイルできるようにします。

返された文字列を出力したい場合は、putStrLnまたはを使用できprintます。

do
    putStrLn (compileProg tc)
    return ()

putStrLnタイプがあるので、String -> IO ()次を削除できますreturn ()

do
    putStrLn (compileProg tc)

実際runCompilerには、次のように簡単に記述できます。

runCompiler :: TC -> IO ()
runCompiler = putStrLn . compileProg
于 2013-04-05T12:13:43.297 に答える