【发布时间】:2013-09-17 22:57:07
【问题描述】:
GHC 有几种有用的语言 extensions 用于机械派生各种常见的 Haskell 类型类(-XDeriveFunctor、-XDeriveFoldable、-XDeriveTraversable)。似乎Applicative 是另一个经常需要并且经常容易派生的类。对于包含a 类型槽的简单记录,例如,
data SimpleRecord a = Simple a a a
Applicative 实例是平凡派生的,
instance Applicative SimpleRecord where
pure x = Simple x x x
Simple a1 b1 c1 <*> Simple a2 b2 c2 = Simple (a1 a2) (b1 b2) (c1 c2)
即使在稍微困难的情况下,一些 a 值被埋在其他应用函子中,例如,
data MyRecord f a = MyRecord (f a) a
一个合理的例子很容易写出来,
instance (Applicative f) => Applicative (MyRecord f) where
pure x = MyRecord (pure x) x
MyRecord a1 b1 <*> MyRecord a2 b2 = MyRecord (a1 <*> a2) (b1 b1)
为什么不存在实现这些机械实例的-XDeriveApplicative 扩展?即使是derive 和generic-derive 软件包也明显缺乏Applicative 支持。是否存在阻止这些实例通常有效的理论问题(除了可能威胁Functor、Foldable 或Traversable 扩展的那些原因)?
【问题讨论】:
标签: haskell ghc deriving derivingvia