我应该写一个简短的代码,在那里我将弄清楚是否有一个矩形和另一个矩形重叠。不幸的是,Haskell抱怨支架不匹配。因此,如果你们中的任何人能够简短地看一下我的代码,我将非常感激:
type Point -> (Double, Double)
type Rectangle -> (Point, Point)
overlaps:: Rectangle -> Rectangle -> Bool
overlaps ((x1,y1),(x2,y2)) ((a1,b1),(a2,b2))=(q>=w || t<=z) && (e>=r || u<=i)
where
q=min(a1 a2)
w=min(x1 x2)
e=min(b1 b2)
r=min(y1 y2)
t=max(a1 a2)
z=max(x1 x2)
u=max(b1 b2)
i=max(y1 y2)
答案 0 :(得分:4)
使用type
而非=
定义->
别名。
type Point = (Double, Double)
此外,将参数传递给函数的方法是fun arg1 arg2 arg3 ...
。
所以,
where q = min a1 a2
-- etc.
顺便说一下,编写min (a1 a2)
实际上意味着将函数a1
应用于参数a2
,然后将结果作为参数提供给函数min
。这会导致错误,因为a1
不是函数,并且您希望提供min
两个参数。
答案 1 :(得分:4)
首先,您正确地宣布您的类型,他们应该有一个等号:
type Point = (Double, Double)
type Rectangle = (Point, Point)
其次,你的格式似乎很糟糕。我建议使用一致的间距重新格式化,使用标签不。配置您的编辑器以插入空格,我每隔一天看到SO上的帖子,其中问题是标签缩进,所以请节省您的头痛并切换到空格。尝试将代码格式化为
type Point = (Double, Double)
type Rectangle = (Point, Point)
overlaps :: Rectangle -> Rectangle -> Bool
overlaps ((x1, y1), (x2, y2)) ((a1, b1), (a2, b2)) = (q >= w || t <= z) && (e >= r || u <= i)
where
q = min a1 a2
w = min x1 x2
e = min b1 b2
r = min y1 y2
t = max a1 a2
z = max x1 x2
u = max b1 b2
i = max y1 y2
最后,您会注意到我删除了所有min
和max
中的括号,这是因为Haskell 不使用括号通过函数的参数。这不是你父亲的C / C ++ / Java / C#/ Python /等等。 Haskell只用空格分隔参数。括号可用于将更复杂的表达式作为参数,例如
max (x1 + x2) (y1 + y2)