Новый тип с кортежем

Об этом коде из LearnYouaHaskell:

newtype Pair b a = Pair {getPair :: (a,b)}
instance Functor (Pair c) where
  fmap f (Pair (x, y)) = Pair (f x, y)

Я понимаю, что первая строка создает новый тип данных из кортежа. Однако почему порядок аргументов изменился с Pair b a на getPair :: (a,b)? Если я переключаю один из порядков, то получаю ошибку из-за сопоставления с образцом в определении fmap.


person ysakamoto    schedule 07.08.2014    source источник


Ответы (1)


Классу Functor требуется один аргумент типа, а типу Pair — два. Определение экземпляра для Pair:

instance Functor (Pair c) where ...

фиксирует аргумент первого типа, который соответствует второму элементу кортежа. Это означает, что fmap преобразует первый элемент кортежа. Если бы аргументы типа для Pair были в другом порядке, вместо этого вы преобразовали бы второй элемент кортежа, и определение должно было бы измениться на:

fmap f (Pair (x, y)) = Pair (x, f y)

обратите внимание, что встроенное определение для Functor в парах уже ведет себя таким образом, например.

import Data.Functor
fmap (+1) ("first", 3)
person Lee    schedule 07.08.2014