【发布时间】:2018-11-15 18:43:57
【问题描述】:
所以我在学习 Haskell 教程时玩得很开心……一个挑战是:
“编写一个 Lambda 表达式和映射,获取一个元组列表并生成一个元组列表。该列表包含直角三角形 a 和 b 的两个边的长度。生成一个包含所有三个长度的列表边,其中第三边是 c,用勾股定理找到”(当然)。
示例输入/输出如下:
[(3,4),(5,16),(9.4,2)]
== [(3.0,4.0,5.0),(5.0,16.0,16.76305461424021),(9.4,2,9.610411021387172)]
所以我先做了一些练习,比如得到勾股定理的正确答案,然后像往常一样输入一个元组但输出,然后输入和输出一个元组——一切都奏效了,最终得到了这个Lambda 表达式:
pythagLambdaTupleInOut = (\(a,b) -> (a,b,(sqrt $ a^2 + b^2)))
它编译并产生了这个:
ghci > pythagLambdaTupleInOut (3,4)
(3.0,4.0,5.0)
所以它工作...... 于是我试了一下:
pythagLambdaListTupleInOut = (\[(a,b)] -> [(a,b,(sqrt $ a^2 + b^2))])
它可以编译,但是当我尝试使用它时会发生这种情况:
ghci > pythagLambdaListTupleInOut [(3,4),(5,16)]
*** Exception: six.hs:1376:31-68: Non-exhaustive patterns in lambda
任何线索我错过了什么?与map 有关系吗?根据教程中的示例,我不确定如何在那里工作 map...
Haskell,顺便说一句,很迷人也很酷!
【问题讨论】:
-
[(a,b)]仅匹配单元素列表。为了处理任何长度的列表,您需要一种不同的方法。是的,这是map的东西。
标签: haskell