【问题标题】:How do I perform function on tuples within a list comprehension? Haskell如何在列表理解中对元组执行功能?哈斯克尔
【发布时间】:2014-12-10 22:13:04
【问题描述】:

我有一个名为 image 的类型,它包含一组元组,它们是坐标。我正在尝试进行列表理解,我可以在其中打印出 x 或 y 坐标列表的最大值和最小值。

example :: Image -> (Int,Int)
example e = [ (j,k) | (x,y) <- e, j <- (maximum x), k <- (minimum y)] 

我想打印 (max x, min x) 作为首发。

我不断收到错误,有人可以告诉我正确的方法吗?

编辑:感谢答案,我已将第二行更改为:

example e = [ (j,k) | (x,y) <- e, let j = maximum x, let k = minimum y]

但是得到这个错误:

Couldn't match expected type ‘[a]’ with actual type ‘Int’
Relevant bindings include j :: a (bound at image.hs:69:39)
In the first argument of ‘maximum’, namely ‘x’
In the expression: maximum x

对于 j 和 k

【问题讨论】:

  • 能否展示一些示例代码,以便我们更好地帮助您?
  • 所以你有[(Int, Int)] 之类的东西,你想要([Int], [Int]) 之类的东西?使用unzip
  • 显示错误本身也非常有帮助。 Haskell 的严格类型非常有助于说明为什么给定语句无效。

标签: list haskell tuples


【解决方案1】:

更新答案:

这里是ImagePoint的定义:

type Image = [Point]
type Point = (Int,Int)

还有example应该怎么写:

example :: Image -> (Int,Int)
example e = (maximum xs, minimum xs)
  where xs = map fst e   -- xs = list of the x coordinates
        ys = map snd e   -- ys = list of the y coordinates

原答案:

使用let

example e = [ (j,k) | (x,y) <- e, let j = maximum x, let k = minimum y]

【讨论】:

  • 这给了我这个错误: image.hs:69:51: 无法将预期类型 '[a]' 与实际类型 'Int' 匹配 相关绑定包括 j :: a(绑定在图像.hs:69:39) 在'maximum'的第一个参数中,即'x' 表达式中:maximum x
  • Image的定义是什么?
  • Point 类型的列表,定义为 (Int,Int)。所以它的[点]
  • 谢谢,现在工作。如果我也想获得 snd 的最大值和最小值怎么办,我该怎么做?使用 where 两次给了我一个错误
  • 你不要使用where两次。答案已更新 - 查看 ys 是如何定义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多