评估 Haskell 数据类型中未定义的元素
如果我尝试 > fst(a, b)
其中 a
、b
未定义,我收到 b
未定义的错误。即使在尝试 snd(a, b)
时,也是 b
首先导致错误。我有命令式编程的背景。我想知道这是否是某种我不理解的懒惰。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为 FUZxxl 的评论绝对正确。当我在 Hugs 的 repl 中输入:
这不是一个懒惰/热切的评估事情 - 当 Hugs 检查以确保
fst(a,b)
是有效的 Haskell 代码时,它注意到a
和b
未定义。这两个字母在 Haskell 中没有特殊含义,它们就像在任何其他语言中一样是变量!就像在 Java 中一样:
永远不要说
a
是什么!您可以这样写:要解决此问题,您可以在 let 语句,例如:
or
或
or where 语句
等。
或者,在某个名为无论什么的文件中定义(例如,“TestTuple.hs”)
并在 Hugs 中,转到:
虽然您注意到您正在使用 Hugs,但只是为了参考,在 GHCi 中,您还可以在 REPL 中定义变量,例如 这:
I think FUZxxl's comment is absolutely correct. When I type into Hugs' repl:
This isn't a lazy/eager evaluation thing -- when Hugs checks to make sure that
fst(a,b)
is valid Haskell code, it notices thata
andb
aren't defined. Those two letters don't have special meanings in Haskell, they're variables like in any other language!It's like in Java going:
And never saying what
a
is! You'd instead write something like:To remedy this, you can either define
a
andb
in a let statement, like:or
or
or a where statement
etc.
Alternatively, define in some file called whatever (for example, "TestTuple.hs")
and in Hugs, go:
Although you note that you are using Hugs, just for reference, in GHCi, you can also define variables in the REPL like this:
您将看到以下内容:
如您所见,访问未定义的元素将得出未定义的值。
懒惰使我们能够避免评估整个结构,但是,
您的评论表明您可能忘记声明一些特定的变量,
a
和b
。Here's what you will see:
As you can see, accessing an undefined element evaluates to an undefined value.
Laziness allows us to avoid evaluating the entire structure, however,
Your comment suggests you might have forgotten to declare some specific variables,
a
andb
.我认为你的问题是为什么它抱怨 b 而不是 a,那是因为 haskell 任意评估参数。也就是说,您永远不知道首先评估哪一个。在你的情况下,显然,haskell 在 a 之前偶然评估了 b,这就是为什么它抱怨 b 而不是 a。
I think your question was why is it complaining about b but not a, and that is because haskell evaluates arguments arbitrarily. That is, you never know which one is evaluated first. In your case, apparently, haskell evaluated b before a by chance and that's why it complains about b but not a.