Haskell:在元组列表中出现错误->输出元组列表

时间:2018-11-15 06:24:22

标签: haskell

因此,在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)令人着迷,真是太酷了!

1 个答案:

答案 0 :(得分:7)

您正在寻找的功能是

pythagLambdaListTupleInOut = map (\(a,b) -> (a,b,(sqrt $ a^2 + b^2)))

您的版本失败,因为[(a,b)]模式表示具有单个元素的列表,并且该元素为元组。当您通过带有两个元组的列表haskell无法进行模式匹配时。