在Haskell中进行短暂锻炼时出错

时间:2014-07-22 21:22:24

标签: haskell compiler-errors functional-programming

我应该写一个简短的代码,在那里我将弄清楚是否有一个矩形和另一个矩形重叠。不幸的是,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)

2 个答案:

答案 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

最后,您会注意到我删除了所有minmax中的括号,这是因为Haskell 使用括号通过函数的参数。这不是你父亲的C / C ++ / Java / C#/ Python /等等。 Haskell只用空格分隔参数。括号可用于将更复杂的表达式作为参数,例如

max (x1 + x2) (y1 + y2)