如何将构造函数与Codeworld函数haskell匹配

时间:2018-08-20 07:18:18

标签: haskell codeworld

所以我已经逛了好几个小时,找不到适合我需要的答案,尽管许多人都在同一行,所以很抱歉这是某种重新发布的方式。

在haskell中,我有这个

shapeToPicture :: Shape -> Picture
shapeToPicture (Line p1 p2)         = polyline [p1, p2]
shapeToPicture (Rectangle x y)      = solidRectangle x y
shapeToPicture (Polygon [points])   = solidPolygon [points]
shapeToPicture (Polygon [])         = solidPolygon []
shapeToPicture (Polygon x)          = solidPolygon x
shapeToPicture (Ellipse a b)        = scaled(solidCircle(1), a, b)
shapeToPicture (Circle a b)         = (solidCircle (a, b))

将会编译多边形和直线,但是Rectangle,Circle和Ellipse将显示错误消息

src/View.hs:46:57: error:
    • Couldn't match type ‘(Double, Double)’ with ‘Double’
      Expected type: Double
        Actual type: Coords
    • In the second argument of ‘solidRectangle’, namely ‘b’
      In the expression: (solidRectangle a b)
      In an equation for ‘shapeToPicture’:
          shapeToPicture (Rectangle a b) = (solidRectangle a b)
   |
46 | shapeToPicture (Rectangle a b)      = (solidRectangle a b)
   |                                                         ^
Failed, two modules loaded.

我知道我有一个带坐标的构造函数“ Rectangle”,和一个带Double的代码世界函数“ solidRectangle”,但是我不知道如何匹配它们,以便代码可以编译。出于相同原因,Circle和Ellipse的此消息相同。

注意:这是定义构造函数的方式

type Coords = (Double, Double)

data Shape
  = Line Coords
         Coords
  | Polygon [Coords]
  | Rectangle Coords
              Coords
  | Circle Coords
           Coords
  | Ellipse Coords
            Coords
  deriving (Show)

谢谢。

2 个答案:

答案 0 :(得分:1)

正如您所指出的那样,您的问题是solidRectangle将double作为第二个参数,并且您将double(Coords)的元组传递给了它。

shapeToPicture (Rectangle x y) = solidRectangle x y -- By data definition y :: (Double, Double)

根据ysolidRectangle x y中的含义,您可以选择(Double, Double)的第一个或第二个。例如

shapeToPicture (Rectangle x y) = solidRectangle x $ fst y

答案 1 :(得分:1)

您的Rectangle的{​​{1}}构造函数的类型为Shape,与Coords -> Coords -> Shape相同。涉及四个数字,存储为两对,每对两个。您的模式匹配如下所示:

(Double, Double) -> (Double, Double) -> Shape

如果您匹配类型,则会发现shapeToPicture (Rectangle x y) = solidRectangle x y x :: Coords。因此y :: Coordsx都是数字的“ ”,而不是单个数字。

这可能不是您想要的。您可能意思是这样的:

y

模式匹配现在将两对分开,为您提供每个坐标内x和y坐标的名称。

下一个问题是如何填写右侧。不幸的是,这取决于shapeToPicture (Rectangle (x1, y1) (x2, y2)) = ... 构造函数的含义 ,我不知道。你呢?您是自己设计类型的,还是作为作业的一部分给出的?如果您不知道这是什么意思,那么您可能需要先弄清楚这一点,然后才能写出该等式的右侧。