【问题标题】:Haskell: Couldn't match expected type 'IO b' with actual type boolHaskell:无法将预期类型“IO b”与实际类型 bool 匹配
【发布时间】:2016-01-05 09:36:11
【问题描述】:

我收到以下错误:

Couldn't match expected type `IO b' with actual type `Bool'
In the expression:
  upCheck
    ["########", "#11xxx3#", "#xx2xx3", "#002xx3", ....] 2 [2, 3, 4]
In the expression:
  do { s <- readFile "projekt-board.txt";
       let content = lines s;
       printTable content;
       printHelp;
       .... }
In an equation for `gameFunc':
    gameFunc
      = do { s <- readFile "projekt-board.txt";
             let content = ...;
             printTable content;
             .... }

带有gameFunc的定义:

gameFunc = do
  s <- readFile "projekt-board.txt"
  let content = lines s
  printTable content
  printHelp
  upCheck ["########","#11xxx3#","#xx2xx3","#002xx3","#7x2x44#"] 2 [2,3,4] 

和函数upCheck:

upCheck :: [[Char]] -> Int -> [Int] -> Bool
upCheck tableArr number posArr = do
  --posArr saadakse findBlock funktsiooniga
  let arv = findVIndex (findVertIndex tableArr number)
  let str = tableArr !! (posArr !! 0)
  if ((posArr !! 0) == 1)
  then False
  else if arv == (-1)
    then False
    else if isHorizontal str number
      then False
      else if (tableArr !! ((posArr !! 0)-1)) !! arv /= 'x'
        then False
        else True

所以基本上这里发生的事情是upCheck 是一个检查某些条件是否匹配的函数,当我从 ghci 调用它的方式与我从函数 gameFunc 调用它的方式相同时,我会得到结果True。但是,如果我从函数 gameFunc 中调用它,则会收到上述错误。任何想法出了什么问题?

【问题讨论】:

    标签: haskell monads io-monad


    【解决方案1】:

    问题在于您的函数gameFunc 使用了一个do 表达式,它是monad 的语法糖(在本例中为IO monad)。您可以使用return 函数将任何非单子结果转换为单子结果:

    return :: Monad m => a -> m a
    

    所以你可以将你的gameFunc 重写为(见最后一行):

    gameFunc = do
      s <- readFile "projekt-board.txt"
      let content = lines s
      printTable content
      printHelp
      return $ upCheck ["########","#11xxx3#","#xx2xx3","#002xx3","#7x2x44#"] 2 [2,3,4]
    

    现在gameFunc 的类型为IO Bool。您可以在其他单子环境中使用gameFunc,例如:

    main = do
        b <- gameFunc
        print b
    

    为了打印gameFunc的结果。

    【讨论】:

    • 据我了解情况,是的。不过,我认为您最好对 Monads 有所了解,因为在 Haskell 中与 IO 相关的所有内容都需要一些 Monads 知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2017-09-16
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多