如果我有两个常数:
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!"
这是正确的吗?
答案 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
的第一部分根本不正确:A
和B
是类型,而不是数据构造函数
我们可以写(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