小编Nat*_*ell的帖子

折叠Haskell中的多态列表

我有一个记录集合,分布在一个相互引用的大型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

14
推荐指数
1
解决办法
1181
查看次数

使用RankNTypes和TypeFamilies的非法多态或限定类型

我一直在慢慢地将llvm包移植到使用数据类型,类型族和type-nats,并在尝试删除用于分类值的两个新类型(ConstValueValue)时通过引入Value由其参数化的新类型而遇到了一个小问题.常量性.

CallArgs只接受Value 'Variable a参数和铸造提供了一个函数Value 'Const aValue '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)

haskell type-families

11
推荐指数
1
解决办法
1350
查看次数