Прямо к точке, объявления типов следующие:
type Pnt = (Int, Int)
type Image = Array Point Int
type Pixels = [Int]
type Dims = (Int, Int)
type Block = (Point,Pixels)
Что я пытаюсь сделать, это получить Image
, и из этого изображения получить определенный блок пикселей в позиции Pnt
с шириной и длиной Dims
.Работать только с одной точкой - это нормально, никаких проблем или чего-то еще;
takeAblock :: Image -> Dims -> Pnt -> Block
takeAblock i (w,h) (x,y) = ((x,y), [i!(u,v) | v <-[y..y + h - 1], u <- [x..x + w - 1]])
Однако, пытаясь получить несколько точек, я застреваю на том, что правильная реализация, как я считаю, является компилятором.Кажется, не согласен со мной
takeManyBlocks :: Image -> Dims -> [Pnt] -> [Block]
takeManyBlocks i d ps = takeAblock i d (map ps)
where ps (x,y) = x // Error
И ошибка заключается в следующем:
Couldn't match expected type `Pnt'
against inferred type `[(t, t1)] -> [t]'
In the third argument of `takeAblock', namely `(map ps)'
In the expression: takeAblock i d (map ps)
In the definition of `takeAblock':
takeAblock i d ps
= takeAblock i d (map ps)
where
ps (x, y) = x
Я действительно не могу понять, почему это не работает, я дажепопытался map (*1) ps
проверить, не является ли отсутствие указанной функции проблемой, но ничего, ошибка компиляции осталась прежней.Куда я иду не так?