在Haskell中使用IO Monad

时间:2013-11-24 17:43:41

标签: haskell

如果我有两个常数:

type A = Int  
type B = Int  

然后应用函数:

Number :: String −> (Int −> Bool) −> IO Int
Number n = do
    num <- fmap getNumber getLine
    if num >0 || num <= A || num <= B then num else putStrln "Invalid Number!"

这是正确的吗?

1 个答案:

答案 0 :(得分:1)

第一行num <- fmap getNumber getLine是正确的(如果getNumber = read),但第二行不是

if num >0 || num <= A || num <= B then num else putStrln "Invalid Number!"

让我们看一下if表达式的第二部分:

num :: Int,但putStrln "Invalid Number!" :: IO ()

但他们必须有相同的类型!

如果我们重写then return num,则意味着键入return num :: IO Int,但仍然putStrln "Invalid Number!" :: IO ()

if的第一部分根本不正确:AB是类型,而不是数据构造函数

我们可以写(num > (x :: A)),这与num > (x :: Int)相同,如下所示:

num > 0 || num <= (3 :: A) || num <= (42 :: B)

<强>更新

当然,函数名称不能是大写字母Number。所有功能都以小写字母开头。

P.S。您示例中的n是未使用的变量

有效功能如下:

numA = 3
numB = 42

number = do
    num <- fmap read getLine
    if num > 0 || num <= numA || num <= numB 
      then return (Just num)
      else putStrln "Invalid Number!" >> return Nothing