如果我尝试> fst(a, b)
where a
, b
are undefined ,我会得到未定义的错误b
。即使在尝试snd(a, b)
它也是b
首先导致错误。我有命令式编程的背景。我想知道这是否是某种我不理解的懒惰。
问问题
751 次
3 回答
5
我认为FUZxxl的评论是绝对正确的。当我输入 Hugs 的回复时:
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);
永远不要说是什么a
!你会写一些类似的东西:
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
等等
或者,在一些文件中定义任何东西(例如,“TestTuple.hs”)
a = 1
b = 2
在拥抱中,去:
>:load TestTuple.hs
>fst(a,b)
1
尽管您注意到您使用的是 Hugs,但仅供参考,在GHCi中,您也可以像这样在 REPL 中定义变量:
>let a = 1
>let b = 2
>fst(a,b)
1
>snd(a,b)
2
于 2011-06-25T17:23:53.070 回答
1
以下是您将看到的内容:
Prelude> fst (undefined, undefined)
*** Exception: Prelude.undefined
Prelude> snd (undefined, undefined)
*** Exception: Prelude.undefined
如您所见,访问未定义元素的计算结果为未定义值。
懒惰使我们能够避免评估整个结构,但是,
Prelude> snd (undefined, 2)
2
您的评论表明您可能忘记声明一些特定变量,a
并且b
.
于 2011-06-25T17:07:10.973 回答
0
我认为您的问题是为什么它抱怨 b 而不是 a,那是因为 haskell 任意评估论点。也就是说,您永远不知道首先评估哪个。在您的情况下,显然,haskell 在 a 之前评估了 b,这就是它抱怨 b 而不是 a 的原因。
于 2011-07-22T11:55:44.733 回答