有时某些数据类型包含多个类型参数(例如Either a b
和(a,b)
)。我们可以为b
参数创建一个Functor实例,事实证明这很简单。但是a
参数呢?我知道可以用相反的顺序将所有参数包装在newtype
中,但是有一种方法可以创建第二阶类型类的实例(这是描述Functor
/的正确方法Applicative
/ Monad
?)直接在最后一个参数以外的参数上?我不这么认为,但实际上找不到在任何地方写下来的内容。
上下文:
Another question on Stack Overflow来自研究Haskell的一名学生,该学生试图为自己的类Either类型创建Functor实例,大概是作为一个类分配。不幸的是,他们将数据类型定义为data Alt a b = Success a | Failure b
,并且由于希望对a
参数进行fmap操作而无法使函子实例正常工作。当我意识到我实际上并不确定这一点时,我将要写Functor
实例仅适用于最后一个参数。这就是我的问题。