Newtype with Tuple

时间:2014-08-07 15:16:42

标签: haskell newtype

关于此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定义中的模式匹配,我会收到错误。

1 个答案:

答案 0 :(得分:9)

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)