【发布时间】:2021-08-23 12:00:39
【问题描述】:
我想为Identity 新类型写一个Alternative 实例。骨架并不难:
instance Alternative Identity where
empty = _
(<|>) = _
但是,所有类型都无法实现。如果我有一个 a 的 Monoid 实例,那会很容易:
instance Alternative Identity where
empty = Identity mempty
(Identity a) <|> (Identity a') = Identity (a <> a')
有没有办法告诉编译器我想定义 Alternative 实例仅适用于内部类型具有 Monoid 实例时?由于a 没有在任何地方提及,我不能只使用约束Monoid a =>。
【问题讨论】:
-
这是类型
F A的Monoid实例和F的Alternative实例之间的本质区别。meppty和mappend是(或至少可能是)使用A的知识单态定义的。empty和<|>仅适用于F的结构,并且必须对所有可能应用的a类型都完全相同。 -
阅读约束单子;这将是一个受约束的替代函子。参见例如ku-fpg.github.io/practice/constrainedTypeClassInstances 或 doisinkidney.com/posts/2017-03-08-constrained-applicatives.html 为起点。
标签: haskell alternative-functor