Создание прямоугольника? - Haskell - PullRequest
0 голосов
/ 02 мая 2018
rectangleRaster :: Coord -> Coord -> Raster
rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])

Прямоугольник определяется двумя точками:

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

и точка определяется как

type Point = (Double, Double)

где:

type Shade = Double
type Coord = (Int, Int)

и

type Pixel = (Coord, Shade)
type Raster = [Pixel]

ошибка:

src\View.hs:70:24: error:
* Couldn't match type `Shape' with `[Pixel]'
  Expected type: Raster
    Actual type: Shape
* In the expression: (Rectangle [(a, 1)] [(b, 1)])
  In an equation for `rectangleRaster':
      rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |
70 | rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^

src\View.hs:70:34: error:
    * Couldn't match type `[(Coord, Integer)]' with `(Double, Double)'
      Expected type: Point
        Actual type: [(Coord, Integer)]
    * In the first argument of `Rectangle', namely `[(a, 1)]'
      In the expression: (Rectangle [(a, 1)] [(b, 1)])
      In an equation for `rectangleRaster':
          rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |
70 | rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |                                  ^^^^^^^^

src\View.hs:70:43: error:
    * Couldn't match type `[(Coord, Integer)]' with `(Double, Double)'
      Expected type: Point
        Actual type: [(Coord, Integer)]
    * In the second argument of `Rectangle', namely `[(b, 1)]'
      In the expression: (Rectangle [(a, 1)] [(b, 1)])
      In an equation for `rectangleRaster':
          rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |
70 | rectangleRaster a b = (Rectangle [(a, 1)] [(b, 1)])
   |            

Не уверен, что я делаю не так? Это может быть связано с тем, что Raster является списком [Pixel], если так, может кто-нибудь помочь мне решить эту проблему? Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Rectangle - конструктор данных. Создает значение типа Shape в соответствии с определением

data Shape = .... | Rectangle Point Point | ....
--   ^^^^^          ^^^^^^^^^ ^^^^^ ^^^^^
--   type           data      type  type
--                constructor

На самом деле имеет тип Rectangle :: Point -> Point -> Shape.

Но по вашему определению

rectangleRaster :: Coord -> Coord -> Raster
rectangleRaster a b = Rectangle [(a, 1)] [(b, 1)]

вы объявили rectangleRaster как функцию, возвращающую Raster, а не Shape. Отсюда ошибка несоответствия типов. Который даже говорит,

src\View.hs:70:24: error:
* Couldn't match type `Shape' with `[Pixel]'
  Expected type: Raster
    Actual type: Shape

т.е. ожидает, что найдет Raster, согласно вашей спецификации объявления / типа, но на самом деле находит значение типа Shape, созданное конструктором данных Rectangle :: Point -> Point -> Shape.

0 голосов
/ 02 мая 2018

Непонятно, что вы хотите сделать, но если вы хотите написать функцию с типом, заданным для rectangleRaster, вам не нужно привлекать Rectangle.

Самое простое решение, похожее на OP, выглядит примерно так:

rectangleRaster :: Coord -> Coord -> Raster
rectangleRaster a b = [(a, 1), (b, 1)]

Здесь я жестко закодировал значение Shade каждого Pixel как 1, так как это выглядит как попытка решения в ОП.

Вы можете вызвать функцию следующим образом:

*Q50128894> rectangleRaster (1,2) (3,4)
[((1,2),1.0),((3,4),1.0)]

Если, с другой стороны, вы хотите создать Rectangle, вам необходимо указать два значения Point, которые вы можете сделать, как в следующем примере GHCi:

*Q50128894> Rectangle (1,2) (3,4)
Rectangle (1.0,2.0) (3.0,4.0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...