Newtype with Tuple

ysa*_*oto 3 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)
Run Code Online (Sandbox Code Playgroud)

我知道第一行是从元组创建一个新的数据类型.然而,为什么参数的顺序切换Pair b agetPair :: (a,b)?如果我切换其中一个订单,那么由于定义中的模式匹配而出现错误fmap.

Lee*_*Lee 9

Functor类需要一个单一类型的参数,而Pair类型有两个.实例定义Pair:

instance Functor (Pair c) where ...
Run Code Online (Sandbox Code Playgroud)

修复了第一个类型参数,它对应于元组的第二个元素.这意味着fmap转换元组的第一个元素.如果类型参数Pair是以其他顺序,则您将转换第二个元组元素,而定义必须更改为:

fmap f (Pair (x, y)) = Pair (x, f y)
Run Code Online (Sandbox Code Playgroud)

请注意Functoron对的内置定义已经表现为这种方式,例如

import Data.Functor
fmap (+1) ("first", 3)
Run Code Online (Sandbox Code Playgroud)