我的Haskell还有另外一个问题。我从问题中获得了以下数据构造函数,
type Point = (Int, Int)
data Points = Lines Int Int
| Columns Int Int
| Union Points Points
| Intersection Points Points
它是关于网格起点(0,0)和(x,y)的点,x是距离原点的水平距离,y是距离原点的垂直距离。
我试图从中定义一个函数“Lines”,给定的行x y将评估网格上垂直距离x~y的所有点。 例如
> Lines 2 4
(0,2)(1,2)(2,2)(3,2)....
(0,3)(1,3)(2,3)(3,3)....
(0,4)(1,4)(2,4)(3,4)....
等等。我做了什么,是,
Lines :: Int -> Int -> Points
Lines lo hi = [ (_, y) | lo <= y && y <= hi ]
但是哈斯克尔抱怨说;
这是什么意思? “点数”已在上面定义......当然“Int”“点数”被视为“类型”?我没有看到问题,为什么Haskell感到困惑?无效的类型签名Lines :: Int - &gt; Int - &gt;点。
的形式
应该是::
答案 0 :(得分:9)
函数不能以大写字母开头。因此,您需要使用lines
,而不是Lines
。这可能是您看到的错误消息的来源。
语法[ ... ]
用于创建结果的列表,但您的类型签名声称该函数返回Points
,这不是任何类型的名单。如果您要返回Point
值列表,那就是[Point]
类型。
我完全不知道你的Lines
的实现是什么。语法对我没有意义。
好的,所以考虑你的意见......
您可以通过撰写lo
生成hi
和[lo .. hi]
之间的数字列表。
你说X中有一个“任意”值,但是你需要确切地说明这意味着什么。你的例子似乎建议你永远想要0以上的数字。生成该列表的方法是[0 .. ]
。 (没有给出上限会使列表无穷无尽。)
您的示例建议您需要一个列表列表,内部列表包含所有具有相同Y坐标的点与所有可能的X坐标配对。
所以这是一种可能的方法:
type Point = (Int, Int)
lines :: Int -> Int -> [[Point]]
lines lo hi = [ [(x,y) | x <- [0..]] | y <- [lo .. hi] ]
这可能是一个很难阅读,所有那些开放和结束括号,所以也许我可以使它更清洁:
lines lo hi =
let
xs = [0..]
ys = [lo .. hi]
in [ [(x,y) | x <- xs] | y <- ys]
如果你运行它,你得到
> lines 2 4
[[(0,2), (1,2), (2,2), ...],
[(0,3), (1,3), (2,3), ...],
[(0,4), (1,4), (2,4), ...]]
换句话说,外部列表有3个元素(Y = 2,Y = 3和Y = 4),三个内部列表中的每一个都是无限长的(每个可能的正X值)。