内容简介:翻译自:https://stackoverflow.com/questions/23484270/haskell-length-map-explanation
一起玩,而我发现了一些我不理解的东西,我找不到解释.如果我尝试运行此代码:
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长度图说明?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- memcached对key和value的限制 memcached的key最大长度和Value最大长度
- protobuf可变长度原理
- perl – 截断stdin行长度?
- 聊一聊CSS中的长度单位
- 掌握web开发基础系列--长度单位
- 输入长度受限情况下的 XSS 攻击
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ACM国际大学生程序设计竞赛题解
赵端阳//袁鹤 / 电子工业 / 2010-7 / 39.00元
随着各大专院校参加ACM/ICPC热情的高涨,迫切需要有关介绍ACM国际大学生程序设计竞赛题解的书籍。《ACM国际大学生程序设计竞赛题解(2)》根据浙江大学在线题库的部分题目,经过分类、筛选、汇编,并进行了解答(个别特别简单或者特别复杂的题目未选择),比较详细地分析和深入浅出地讲解了解题的方法和用到的算法。题目的类型包括基础编程、模拟、字符串处理、搜索、动态规划、回溯、图论、几何和数学题。 ......一起来看看 《ACM国际大学生程序设计竞赛题解》 这本书的介绍吧!