【问题标题】:Haskell: error taking in list of tuples -> outputting list of tuplesHaskell:输入元组列表时出错->输出元组列表
【发布时间】: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


【解决方案1】:

你要找的功能是

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

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

【讨论】:

  • 你需要在 lambda 周围加上括号,或者在它和 map 之间加上 $,除非你启用了 BlockArguments 扩展(从 GHC 8.6.1 开始),它允许 lambda 和 do块直接作为函数参数
  • 好的,所以现在我感觉有点像个笨蛋。现在我看到它是如此明显......我什至在另一个练习中做了类似的事情!我一定是因为玩得太晚了。谢谢@talex
  • @Stormy 不用担心。每个研究新事物的人都会时不时地产生这种感觉。
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多