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