很抱歉,我的英语说得不好。
让我们看看下面的代码。
main = getChar首先,会对main求值,它的值是" getChar ",但是编译器不知道"getChar“的值,所以编译器会计算"getChar”来计算"getChar“的值,这样,getChar就会被执行。
实际上,当我测试上面的代码时。“执行getChar。
让我们看看下面的代码。
main = return (getChar, getChar)首先,主求值,它的值是return (undefined,undefined) -> IO (undefined,undefined),所以prelude将计算IO (undefined,undefined)来打印值。因此,将评估两个getChar中的一个。
但是,当我测试上面的代码时,两个getChar都没有被评估。我不明白为什么两个getChar都没有被评估。
发布于 2012-05-13 08:41:42
您必须实际执行您的一元操作,然后返回它们的执行结果。
func = do
a <- getChar
b <- getChar
return (a,b)您当前所做的类似于C语句:
void main(char &a, char &b)
{
a = getchar;
b = getchar;
}而不是你真正想要的:
void main(char &a, char &b)
{
a = getchar();
b = getchar();
}发布于 2012-05-13 16:22:35
“我想知道为什么两个getChar都没有被评估”
首先,在英语中,就像在逻辑、数学或haskell中,( == (不是p)) == p,因此你的问题是:
我想知道为什么这两个getChars都要求值。
令人困惑,因为我打赌它们都没有被评估过。
您的main函数计算IO a的值,然后将计算类型为a的IO中的值。在您的示例中,是(IO Char,IO Char)。因为Haskell是一种非严格的语言,所以计算元组只意味着构造元组。这不包括对元组组件的评估。例如:
fst (42, 7 `quot` 0 :: Int)将不会因被零除错误而中止。因此,我们有:
(getChar, getChar) 是一个具有2个未计算的值的元组。但是即使计算了这些值,我们也有两个IO Char类型的值。这样的值可以看作是在IO monad中执行时返回Char的操作。
因此,不仅您的元组组件没有计算,它们也不会在IO monad中执行。
要实现这一点,您可以将包含两个操作的元组传递给另一个操作:
executeBoth (a,b) = do
ra <- a
rb <- b
return (ra, rb)现在,去检查一下executeBoth的类型,你可能会明白这一点。
https://stackoverflow.com/questions/10568470
复制相似问题