我正在使用generics-sop库。我想写一个具有以下类型的值:
values :: forall r. IsEnumType r => NP (K r) (Code r)
也就是说,对于构造函数没有任何参数 ( IsEnumType
) 的 sum 类型,我想生成一个 n 元乘积 ( NP
),它在每个点都包含相应的构造函数值。
例如,对于类型
{-# LANGUAGE DeriveGeneric #-}
import qualified GHC.Generics as GHC
import Generics.SOP
data Foo = Bar
| Baz
deriving (GHC.Generic)
instance Generic Foo
我想生产 n 元产品
K Bar :* K Baz :* Nil
我相信解决方案将涉及转换带有每个构造函数的通用表示的 n 元乘积,所以我写了这个:
values :: forall r. IsEnumType r => NP (K r) (Code r)
values = liftA_NP (mapKK (to . SOP)) _