我有一个记录集合,分布在一个相互引用的大型Haskell应用程序中的多种类型中.涉及的所有类型都实现了一个共同的类型类.类型类包含对变量及其所有子项起作用的para函数,非常类似于uniplate的函数.
这是我想要构建的简化代码示例.是否有可能(并且合理)获得通用功能来折叠在GHC中实现给定类型类的记录字段...
{-# LANGUAGE RankNTypes #-}
myPara :: forall a r . (Data a, Foo a)
=> (forall b . Foo b => b -> [r] -> r)
-> a
-> r
-- or as a fold
myFold :: forall a r . (Data a, Foo a)
=> (forall b . Foo b => r -> b -> r)
-> r
-> b
-> r
Run Code Online (Sandbox Code Playgroud)
但通用到足以与任意类型类一起使用?
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Generics.Uniplate.Data …Run Code Online (Sandbox Code Playgroud) haskell generic-programming existential-type higher-rank-types
我一直在慢慢地将llvm包移植到使用数据类型,类型族和type-nats,并在尝试删除用于分类值的两个新类型(ConstValue和Value)时通过引入Value由其参数化的新类型而遇到了一个小问题.常量性.
CallArgs只接受Value 'Variable a参数和铸造提供了一个函数Value 'Const a的Value 'Variable a.我想概括CallArgs为允许每个参数为'Const或者'Variable.是否可以使用类型系列以某种方式对此进行编码?我认为这可能与fundeps有关.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
data Const = Const | Variable
data Value (c :: Const) (a :: *)
type family CallArgs a :: *
type instance CallArgs (a -> b) = forall (c :: Const) . Value c a -> CallArgs b
type …Run Code Online (Sandbox Code Playgroud)