两个模块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)
答案 0 :(得分:12)
您似乎对return
感到困惑。它不是像其他编程语言那样返回值的关键字。在Haskell中,return
是一个将纯值提升为monadic(例如Int
到IO 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
函数。