"无法匹配类型`可能'与'IO'预期类型:IO字符串实际类型:可能字符串"在Haskell中

Tom*_*ert 1 monads haskell maybe

我试图把我的头包裹在Monads周围,并且觉得如果我能解释为什么这不能编译,我会有更好的理解.

module Main where
import Data.Maybe
import System.Environment

myFunc :: String-> Maybe String
myFunc x = Just x

main :: IO ()
main = myFunc "yo" >>= putStrLn 
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

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
Run Code Online (Sandbox Code Playgroud)

我意识到问题在于我正在尝试将a Maybe与a匹配IO,但我并不完全确定如何将我的Maybe'd变量转换为IO.任何帮助将不胜感激!

Sib*_*ibi 7

你是意识到你正在试图匹配正确的MaybeIO.对于类型检查的bind(>>=)运算符,Monad都应该是相同的.解决这个问题的一种方法是将包裹MaybeIO使用单子return:

return (myFunc "yo") >>= putStrLn . show
Run Code Online (Sandbox Code Playgroud)

或者更简单:

return (myFunc "yo") >>= print
Run Code Online (Sandbox Code Playgroud)

话虽这么说,你不需要所有花哨的monad操作员.这应该只是工作:

main :: IO ()
main = print . myFunc $ "yo"
Run Code Online (Sandbox Code Playgroud)

  • @Tombert`print`被定义为`putStrLn.show`.因此它可以采用任何具有"Show"实例的类型! (2认同)