无法将预期类型'Bool'与'm Bool'类型匹配

时间:2011-10-22 00:13:08

标签: haskell

两个模块Up.hs和Down.hs

module Up (isSortedUp) where
isSortedUp x y z = if x>y && y>z then return(True) else return(False)


module Down (isSortedDown) where
isSortedDown x y z = if x<y && y<z then return(True) else return(False)

主程序Main.hs

import System.Environment
import Up
import Down
main = do
  args<-getArgs
  let a = read(args !! 0)
  let b = read(args !! 1)
  let c = read(args !! 2)
  if (isSortedUp a b c || isSortedDown a b c) 
    then putStrLn "True" 
    else putStrLn "False"

在编译期间,我收到以下错误:

Couldn't match expected type `Bool' with actual type `m0 Bool'
In the return type of a call of `isSortedUp'
In the first argument of `(||)', namely `isSortedUp a b c '
In the expression: (isSortedUp a b c || isSortedDown a b c)

3 个答案:

答案 0 :(得分:12)

您似乎对return感到困惑。它不是像其他编程语言那样返回值的关键字。在Haskell中,return是一个将纯值提升为monadic(例如IntIO Int)的函数。你不要将它用于非monadic代码。

isSortedUp x y z = if x>y && y>z then True else False

此外,您只需撰写if foo then True else False

,而不是撰写foo
isSortedUp x y z = x>y && y>z

您的main功能也可以使用模式匹配进行简化,并且{/ 1}}布尔值打印print"True"

"False"

答案 1 :(得分:2)

我不相信你的功能需要“回归”。由于isSorted函数不返回monad,它们只是简单地评估函数,因此不需要被包装(这就是返回的功能)。您还可以通过一些解构来简化let语句。

我建议尝试:

import System.Environment

isSortedUp x y z = x>y && y>z
isSortedDown x y z = x<y && y<z

main = do
  args<-getArgs
  let (a:b:c:xs) = args
  if ((isSortedUp a b c) || (isSortedDown a b c)) then putStrLn "True" else putStrLn "False"

答案 2 :(得分:0)

请勿在{{1​​}}函数中调用return函数。