Haskell长度图说明?

栏目: 编程语言 · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/23484270/haskell-length-map-explanation
因为我正在学习语言,所以我正在和 Haskell

一起玩,而我发现了一些我不理解的东西,我找不到解释.如果我尝试运行此代码:

map (`div` 0) [1,2,3,4]

我得到除以0的异常,这是预期的.

但是,如果我运行此代码:

length (map (`div` 0) [1,2,3,4])

我得到4!

我想知道为什么当我在长度函数内部进行映射时,我没有得到除以0的异常!

可以通过以下方式定义map和length函数:

map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

length :: [a] -> Int
length [] = 0
length (_:xs) = 1 + length xs

现在,让我们手动解决为什么你的第二个例子按照它的方式工作.它是这样的:

length (map (`div` 0) (1:2:3:4:[]))
    = length (1 `div` 0 : map (`div` 0) (2:3:4:[]))     -- second map equation
    = 1 + (length (map (`div` 0) (2:3:4:[])))           -- second length equation
    = 1 + (length (2 `div` 0 : map (`div` 0) (3:4:[]))) -- second map equation
    .
    .
    .
    = 1 + (1 + (1 + (1 + length (map (`div` 0) [])))))  -- second length equation
    = 1 + (1 + (1 + (1 + length []))))                  -- first map equation
    = 1 + (1 + (1 + (1 + 0))))                          -- first length equation
    = 4                                                 -- arithmetic

这里的诀窍是什么?在Haskell中,评估表达式的过程称为强制它.强制表达式执行必要的最少工作,以便找出结果的最外层数据构造函数.作为其中的一部分,子表达式将仅在必要时被强制实现目标.

所以在这个例子中,我们强制的最外层表达式是length函数的应用.长度的定义有两种情况,一种使用[]列表构造函数,另一种使用(:)构造函数,因此要应用长度,我们需要弄清楚这两种情况中的哪一种应用于参数.由于参数的最外层位置没有构造函数,因此我们必须强制它查找.这就是上面推导的第一行和第二行之间的步骤;我们通过查看其参数并选择第二个映射方程来强制映射子表达式.

但在那之后,我们需要所有信息来确定两个长度方程中的哪一个适用,所以我们按照“最外面的第一”规则并应用适当的长度方程.在这种情况下,这将丢弃包含除以零的子表达式,这意味着永远不会强制子表达式,并且永远不会触发错误.

但是,在第一个示例中,当您将表达式键入GHCI时,您隐式要求解释器打印其结果.这要求它强制列表的主干访问其元素,并强制元素本身打印它们.因此,当您强制列表的第一个元素时,会发生零错误除法.

编辑:让我指出你可能没有注意到的一个细微差别.当我们在GHCI中尝试你的第一个例子时,这是会话的结果:

*Main> map (`div` 0) [1,2,3,4]
[*** Exception: divide by zero

看到第二行开头那个孤独的开口方括号?这是在被零除错误发生之前打印的列表的开始括号.同样,请注意此示例中发生的情况:

*Main> map (20 `div`) [1,2,0,4]
[20,10,*** Exception: divide by zero

结果列表的前两个元素,甚至是将第二个元素与第三个元素分开的逗号,都会成功打印,因为Haskell在需要打印之前不会尝试计算第三个列表元素.

翻译自:https://stackoverflow.com/questions/23484270/haskell-length-map-explanation


以上所述就是小编给大家介绍的《Haskell长度图说明?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码