首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算"main = return (getChar,getChar)“

计算"main = return (getChar,getChar)“
EN

Stack Overflow用户
提问于 2012-05-13 08:28:59
回答 2查看 503关注 0票数 2

很抱歉,我的英语说得不好。

让我们看看下面的代码。

代码语言:javascript
复制
main = getChar

首先,会对main求值,它的值是" getChar ",但是编译器不知道"getChar“的值,所以编译器会计算"getChar”来计算"getChar“的值,这样,getChar就会被执行。

实际上,当我测试上面的代码时。“执行getChar。

让我们看看下面的代码。

代码语言:javascript
复制
main = return (getChar, getChar)

首先,主求值,它的值是return (undefined,undefined) -> IO (undefined,undefined),所以prelude将计算IO (undefined,undefined)来打印值。因此,将评估两个getChar中的一个。

但是,当我测试上面的代码时,两个getChar都没有被评估。我不明白为什么两个getChar都没有被评估。

EN

回答 2

Stack Overflow用户

发布于 2012-05-13 08:41:42

您必须实际执行您的一元操作,然后返回它们的执行结果。

代码语言:javascript
复制
func = do
    a <- getChar
    b <- getChar
    return  (a,b)

您当前所做的类似于C语句:

代码语言:javascript
复制
void main(char &a, char &b)
{
    a = getchar;
    b = getchar;
}

而不是你真正想要的:

代码语言:javascript
复制
void main(char &a, char &b)
{
    a = getchar();
    b = getchar();
}
票数 4
EN

Stack Overflow用户

发布于 2012-05-13 16:22:35

“我想知道为什么两个getChar都没有被评估”

首先,在英语中,就像在逻辑、数学或haskell中,( == (不是p)) == p,因此你的问题是:

我想知道为什么这两个getChars都要求值。

令人困惑,因为我打赌它们都没有被评估过。

您的main函数计算IO a的值,然后将计算类型为a的IO中的值。在您的示例中,是(IO Char,IO Char)。因为Haskell是一种非严格的语言,所以计算元组只意味着构造元组。这不包括对元组组件的评估。例如:

代码语言:javascript
复制
fst (42, 7 `quot` 0 :: Int)

将不会因被零除错误而中止。因此,我们有:

代码语言:javascript
复制
(getChar, getChar) 

是一个具有2个未计算的值的元组。但是即使计算了这些值,我们也有两个IO Char类型的值。这样的值可以看作是在IO monad中执行时返回Char的操作。

因此,不仅您的元组组件没有计算,它们也不会在IO monad中执行。

要实现这一点,您可以将包含两个操作的元组传递给另一个操作:

代码语言:javascript
复制
executeBoth (a,b) = do
    ra <- a
    rb <- b
    return (ra, rb)

现在,去检查一下executeBoth的类型,你可能会明白这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10568470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档