关于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 a到getPair :: (a,b)?如果我切换其中一个订单,那么由于定义中的模式匹配而出现错误fmap.
本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)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |