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)])
|
Не уверен, что делаю не так? Возможно, это как-то связано с тем, что Растр является списком [Пикселей], если да, может ли кто-нибудь помочь мне решить эту проблему? Спасибо!
Да, я понял это, когда сделал пост. Я отредактировал сообщение в соответствии с тем, что пытался, но все еще получаю сообщение об ошибке. Извините, я новичок в Haskell и делаю глупые ошибки.
Непонятно, что вы хотите сделать, но если вы хотите написать функцию с типом, указанным для 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
.
Вы, кажется, не совсем понимаете разницу между
type
иdata
.Raster
,Shade
иCoord
не существуют нигде, кроме уровня типа, где они просто псевдонимы для существующих типов.