私はモナドに頭を包み込もうとしていますが、これがコンパイルされない理由を説明できれば、理解が深まると思います。
module Main where
import Data.Maybe
import System.Environment
myFunc :: String-> Maybe String
myFunc x = Just x
main :: IO ()
main = myFunc "yo" >>= putStrLn
私が得るエラーは
blah.hs:9:10:
Couldn't match type `Maybe' with `IO'
Expected type: IO String
Actual type: Maybe String
In the return type of a call of `myFunc'
In the first argument of `(>>=)', namely `myFunc "yo"'
In the expression: myFunc "yo" >>= putStrLn
私は、問題は私が一致しようとしているということであることを認識Maybe
してIO
、私はIOに私Maybe'd変数をキャストする方法がわからないんだけど全体。どんな助けでも大歓迎です!
あなたが一致しようとしていることを実現するのに適切であるMaybe
とIO
。bind(>>=
)演算子でタイプチェックを行うには、両方のモナドが同じである必要があります。この問題を解決する1つの方法Maybe
は、次IO
を使用してモナドでラップすることreturn
です。
return (myFunc "yo") >>= putStrLn . show
またはもっと簡単に:
return (myFunc "yo") >>= print
そうは言っても、ここではすべての派手なモナド演算子は必要ありません。これは単に機能するはずです:
main :: IO ()
main = print . myFunc $ "yo"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加