Haskell: проблема с использованием карты на абстрактных типах данных - PullRequest
1 голос
/ 03 апреля 2011

Прямо к точке, объявления типов следующие:

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 проверить, не является ли отсутствие указанной функции проблемой, но ничего, ошибка компиляции осталась прежней.Куда я иду не так?

Ответы [ 2 ]

5 голосов
/ 03 апреля 2011

Недостаток функции - это действительно проблема, но не то, как вы думаете; что-то вроде map (*1) ps - это неоперация (для ps список чисел, по крайней мере). Что вы действительно хотите, так это что-то вроде map (takeAblock i d) ps; вещь, которую вы хотите отобразить в списке, это первый параметр map, а не другой его части.

3 голосов
/ 03 апреля 2011

Я думаю, вы хотите что-то вроде:

takeManyBlocks i d ps = [takeAblock i d p | p <- ps]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...