评估Haskell数据类型中的未定义元素

| 如果我在未定义
a
b
的情况下尝试
> fst(a, b)
,则会收到
b
未定义的错误。即使尝试
snd(a, b)
,也是
b
会首先导致错误。我有命令式编程的背景。我想知道这是否是我不理解的惰性。     
已邀请:
        我认为FUZxxl的评论绝对正确。当我输入拥抱的副本时:
Hugs> fst(a,b)
ERROR - Undefined variable \"b\"
Hugs> snd(a,b)
ERROR - Undefined variable \"b\"
这不是一个懒惰/急切的评估工作-当Hugs检查以确保
fst(a,b)
是有效的Haskell代码时,它会注意到未定义
a
b
。这两个字母在Haskell中没有特殊含义,它们像其他任何语言一样都是变量! 就像在Java中一样:
System.out.println(a);
而且永远不要说ѭ1是什么!您可以改写类似以下内容的内容:
String a = \"Hello world.\"
System.out.println(a);
为了解决这个问题,您可以在let语句中定义
a
b
,例如:
>let (a,b) = (1,2) in fst(a,b) 
要么
>let tup = (1,2) in fst tup
要么
>let a=1;b=2 in fst(a,b)
或where语句
>fst(a,b) where a=1;b=2
等等 或者,在一个名为“ everything”的文件中定义(例如,\“ TestTuple.hs \”)
a = 1
b = 2
在拥抱中,去:
>:load TestTuple.hs
>fst(a,b)
1
尽管您注意到您正在使用拥抱,但仅供参考,您还可以在REPL中定义变量,如下所示:
>let a = 1
>let b = 2
>fst(a,b)
 1
>snd(a,b)
 2
    
        这是您将看到的内容:
Prelude> fst (undefined, undefined)
*** Exception: Prelude.undefined
Prelude> snd (undefined, undefined)
*** Exception: Prelude.undefined
如您所见,访问未定义的元素将得出一个未定义的值。 懒惰使我们避免评估整个结构,但是,
Prelude> snd (undefined, 2)
2
您的评论表明您可能已经忘记声明一些特定的变量
a
b
。     
        我认为您的问题是为什么它抱怨b而不是a,这是因为haskell任意评估参数。也就是说,您永远都不知道首先评估哪个。在您的情况下,显然,haskell在a之前偶然地评估了b,这就是为什么它抱怨b而不是a的原因。     

要回复问题请先登录注册