0

如果我尝试> fst(a, b)where a, bare undefined ,我会得到未定义的错误b。即使在尝试snd(a, b)它也是b首先导致错误。我有命令式编程的背景。我想知道这是否是某种我不理解的懒惰。

4

3 回答 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 回答