Haskell 简单函数错误“;变量不在范围内“;哈斯克尔

Haskell 简单函数错误“;变量不在范围内“;哈斯克尔,haskell,Haskell,我今天刚开始编写Haskell,一直在构建一个函数,从用户那里获取一个整数,乘以3,再加上1,然后检查它是否为偶数。将输出返回为布尔值,如果为偶数,则返回true。 对不起,如果代码太错误,我是哈斯克尔新手 checkIfEven :: Int -> Bool x <- readLn let checkIfEven x = (even ((x*3)+1)) print checkIfEven error: Variable not in scope: checkIf

我今天刚开始编写Haskell,一直在构建一个函数,从用户那里获取一个整数,乘以3,再加上1,然后检查它是否为偶数。将输出返回为布尔值,如果为偶数,则返回true。 对不起,如果代码太错误,我是哈斯克尔新手

checkIfEven :: Int -> Bool
x <- readLn
let checkIfEven x = (even ((x*3)+1))
print checkIfEven   

 error:
    Variable not in scope: checkIfEven :: Int -> Bool
checkifeen::Int->Bool
x布尔

必须在Haskell中显式处理I/O,因为
readLn
不是一个函数;这是一个IO动作。从将要检查的值作为参数的true函数开始更简单:

checkIfEven :: Int -> Bool
checkIfEven x = even (x*3 + 1)
注意,括号不是对
偶数
调用的一部分,而是对表达式
x*3+1
进行“分组”,因为
偶数x*3+1
被解析为
(偶数x)*3+1

现在我们有了一个纯函数,我们可以将它应用于用户输入的值

program :: IO Bool
program = do
    x <- readLn
    return (checkIfEven (read x))

关于IO(和单子)如何工作的完整解释超出了这个问题的范围;希望这能让您在进一步学习本主题时了解重点。

您很荣幸能从一个不完美的问题中提供如此好的答案,并向新用户。。。我很佩服。
program = fmap (checkIfEven . read) readLn