通用函子的函子实例

时间:2019-01-11 10:53:46

标签: haskell

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

fconst中不适用,const (f x)我对它的工作方式感到困惑,因为至少它涉及一个变量。

2 个答案:

答案 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"

请注意xy的值大致相同,但是它们属于不同的类型。此外,为了计算y,我们不必使用任何方式使用f,因为x内部没有任何Bool,而y有里面没有Intf就不相关了。

请注意,无论Const a b是什么类型,类型ab是同构的。这就是为什么它被命名为Const的原因:它实际上并没有使用第二个参数。它的第二个参数仍然很重要,因为即使Const a bConst a b'都是同构a,也会导致{{1}}和{{1}}是不同的类型。

答案 1 :(得分:0)

Const实例仅忽略f函数,并且不更改其值。 Id实例对其值应用f函数并返回具有新值的新Id