2014-10-30 2 views
0
type Point = (Double, Double) 

flipsOneY :: Point -> (Int, Int) -> Point 
flipsOneY point (i, j) = ((fst point), ((fromIntegral j) - (snd point))) 

changeY :: [Point] -> (Int, Int) -> [Point] 
changeY xs (i, j) = map flipsOneY xs (i, j) 

У меня есть список точек (x, y), где я хочу изменить значение координаты Y. Когда я пытаюсь скомпилировать это, я получаю эту ошибку:Ошибка при использовании 'map' - Haskell

Expr.hs:149:21: 
Couldn't match expected type `(Int, Int) -> Point' 
      with actual type `[(Int, Int) -> Point]' 
The function `map' is applied to three arguments, 
but its type `(Point -> (Int, Int) -> Point) 
       -> [Point] -> [(Int, Int) -> Point]' 
has only two 
In the expression: map flipsOneY xs (i, j) 
In an equation for `changeY': 
    changeY xs (i, j) = map flipsOneY xs (i, j) 

Я предполагаю, что неправильно использую карту. Приветствуется любой намек на решение. :-)

ответ

3
type Point = (Double, Double) 

flipsOneY :: Point -> (Int, Int) -> Point 
flipsOneY point (i, j) = ((fst point), ((fromIntegral j) - (snd point))) 

changeY :: [Point] -> (Int, Int) -> [Point] 
changeY xs (i, j) = map flipsOneY xs (i, j) 

map принимает 2 аргумента, но вы передаете это три.

Попробуйте положить скобку вокруг flipOnesY вызова, например, так:

changeY :: [Point] -> (Int, Int) -> [Point] 
changeY xs (i, j) = map (\ys -> flipsOneY ys (i, j)) xs 

Это также показывает, что ваш заказ аргумент flipsOneY не является оптимальным.

+0

Не могли бы вы рассказать о «не оптимальной» части? Я думаю, что пример того, как сделать его более оптимальным, будет очень полезен для @Rewbert. – bheklilr

+0

Это решило мою проблему, и я всегда получаю дополнительные советы, чтобы узнать больше. :) Был бы код мне лучше, если бы я просто изменил порядок аргументов, или есть большие недостатки, чтобы принять во внимание? Я помню, как вы прокомментировали мои темы за последние недели. @bheklilr Спасибо, я многому научился за эти недели. Почти с моим первым курсом функционального программирования :) – Rewbert

+1

@Rewbert Да, если вы изменили порядок аргументов 'flipsOneY', тогда вы могли бы определить' changeY' как 'changeY xs ij = map (flipsOneY ij) xs' или если вы поменялись местами порядок аргументов в 'changeY', вы можете пойти без ограничений с помощью' changeY ij = map (flipsOneY ij) '. – bheklilr