data Id a = Id a
data Const a b = Const a
上述函子实例是
instance Functor Id where
fmap f (Id x ) = Id (f x )
instance Functor (Const a) where
fmap f (Const x ) = Const x
f
在const
中不适用,const (f x)
我对它的工作方式感到困惑,因为至少它涉及一个变量。
答案 0 :(得分:3)
假设我们有f :: Bool -> Int
和
x :: Const String Bool
x = Const "some string here"
现在,fmap f x
必须具有类型Const String Int
,其结果y
的唯一合理选择是
y :: Const String Int
y = Const "some string here"
请注意x
和y
的值大致相同,但是它们属于不同的类型。此外,为了计算y
,我们不必使用任何方式使用f
,因为x
内部没有任何Bool
,而y
有里面没有Int
。 f
就不相关了。
请注意,无论Const a b
是什么类型,类型a
与b
是同构的。这就是为什么它被命名为Const
的原因:它实际上并没有使用第二个参数。它的第二个参数仍然很重要,因为即使Const a b
和Const a b'
都是同构a
,也会导致{{1}}和{{1}}是不同的类型。
答案 1 :(得分:0)
Const
实例仅忽略f
函数,并且不更改其值。 Id
实例对其值应用f
函数并返回具有新值的新Id
。