Создаете прямоугольник? - Haskell

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)

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

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)])
   |            

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

Вы, кажется, не совсем понимаете разницу между type и data. Raster, Shade и Coord не существуют нигде, кроме уровня типа, где они просто псевдонимы для существующих типов.

Probie 02.05.2018 09:30

Да, я понял это, когда сделал пост. Я отредактировал сообщение в соответствии с тем, что пытался, но все еще получаю сообщение об ошибке. Извините, я новичок в Haskell и делаю глупые ошибки.

goat 02.05.2018 09:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 147
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

Вы можете вызвать функцию так:

*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)

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.

Другие вопросы по теме