因此,在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)令人着迷,真是太酷了!
答案 0 :(得分:7)
您正在寻找的功能是
pythagLambdaListTupleInOut = map (\(a,b) -> (a,b,(sqrt $ a^2 + b^2)))
您的版本失败,因为[(a,b)]
模式表示具有单个元素的列表,并且该元素为元组。当您通过带有两个元组的列表haskell无法进行模式匹配时。