问题标签 [ghc-generics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
105 浏览

haskell - 使用 GHC.Generics 提取 Id

如何使用从结构中提取标识符(在本例中为整数)GHC.Generics

我有一个Id类型:

以及许多使用该类型的类型:

除此之外,还有其他类型可以包装上述类型,例如标识符:

现在我需要_id从这些包含Id值的任何类型中提取字段。目前我们有大量的样板,我想使用泛型将其废弃。

一开始我想定义一个类:

这样,只有当内部有一个这样的类型时,你才会有一个Identifiable实例(如果上面有多个这样的类型,我们返回从上到下遍历结构时找到的第一个)。现在,当我尝试为产品和总和定义实例时,问题就来了。我想表达类似的东西:IdFuncIdIdGIdentifiable

这不起作用,因为我正在定义重复的实例。

我可以重新定义IdentifiablegetId :: e -> Maybe Id但这会删除一些类型安全,并在我知道一个类型至少包含一个时引入不必要的检查Id

在使用类型系统时,有没有办法表达这种案例分析?

0 投票
1 回答
124 浏览

haskell - 使用类型族和泛型查找 Id 值

这个问题与这个问题有关我想避免Id从数据结构中提取值的样板,但以类型安全的方式。

我将在这里重复问题的相关细节:假设您有一个类型Id

并且您想定义一个函数,该函数从任何包含至少一个值的结构getId中提取它:IdId

现在的问题是如何以类型安全的方式定义这样的类,同时避免使用泛型的样板。

在我之前的问题中,我提到了类型系列,特别是这篇博文中描述的想法。据我了解,这个想法是定义一个类型类MkIdentifiable,以便:

一个值只有在其中嵌套Res了至少一个值时才属于类型:Id

然后,似乎可以定义:

现在的问题是如何定义Res与 GHC.Generics ( U1, K1, :*:, :+:) 的类型相关联的类型族。

我尝试了以下方法:

哪里Choose会像上述博客文章中定义的那样:

但这不会像HasId (l p)has kind那样编译,Res而是需要一个类型。

0 投票
1 回答
224 浏览

haskell - 如何派生涉及类型族的泛型遍历

在配置我们的应用程序时,通常定义字段的方式与使用字段的方式相同:

其他时候,它们有所不同。让我们在类型类中正式化:

一个典型的服务配置有很多字段,每个类别都有一些。参数化我们将组合在一起的较小组件让我们编写大型复合记录一次,而不是两次(一次用于配置规范,一次用于运行时数据)。这类似于“生长的树木”论文中的想法:

UiServerConfig是我想配置的众多此类服务之一,因此最好Generic为此类记录类型派生,并向类添加默认toRunTime实现Config。这就是我们卡住的地方。

给定一个参数化的类型 like data Foo f = Foo { foo :: TypeFn f Int, bar :: String},我一般如何为任何Foo影响每个TypeFn记录字段(递归)的类型派生遍历?

作为我困惑的一个例子,我尝试像这样使用 generics-sop:

这失败了,因为xs :: [[*]], 但是Config需要一个带有 kind 的类型参数a :: ConfigPhase -> *

任何关于阅读什么以便理清思路的提示都将不胜感激。完整的解决方案也是可以接受的:)

0 投票
2 回答
87 浏览

haskell - 用简单求和类型的所有值构造一个 n 元积

我正在使用generics-sop库。我想写一个具有以下类型的值:

也就是说,对于构造函数没有任何参数 ( IsEnumType) 的 sum 类型,我想生成一个 n 元乘积 ( NP),它在每个点都包含相应的构造函数值。

例如,对于类型

我想生产 n 元产品

我相信解决方案将涉及转换带有每个构造函数的通用表示的 n 元乘积,所以我写了这个:

使用liftA_NPmapKK。但我不确定如何自己生成通用表示。

0 投票
1 回答
287 浏览

haskell - 是否可以通过 GHC 的通用派生来派生 Data.Vector.Unbox ?

可以Storable通过 GHC 的通用派生机制进行派生:http: //hackage.haskell.org/package/derive-storable(以及https://hackage.haskell.org/package/derive-storable-plugin以获得性能)。但是,我可以找到的唯一用于派生的库Data.Vector.Unbox使用模板 Haskell:http ://hackage.haskell.org/package/vector-th-unbox 。它还需要用户编写一些代码;它不是完全自动的。

我的问题是,类似的库是否deriving-storable也存在,或者由于某些基本方式与 不同,Unbox这是不可能的?如果是后者,这是否意味着也无法创建一个允许自动派生任何类型的库,因为我找不到这样的库。UnboxStorableUnboxStorable

我问是因为理想情况下我想避免使用模板 Haskell 和使用vector-th-unbox.

0 投票
1 回答
79 浏览

haskell - 用 GHC 泛型定义一个类似“空”的函数?

我正在为 Zoho REST API 编写一个客户端库,并且有一堆具有所有Maybe a字段的不同记录类型,即:

我需要一种方法来定义此类类型的“空”记录,例如:

因此,我伸出手GHC.Generics并得到了一些工作(这是错误的!):

在代码编译时,以下(可以理解)导致运行时堆栈溢出:

我正在关注https://www.stackage.org/haddock/lts-12.1/base-4.11.1.0/GHC-Generics.html#g:12encode给出的教程,由于参数被传递给函数,它允许人们有机会解开/构造函数并构建一些有意义的递归层次结构。如何为我的用例编写泛型泛型函数实际上没有任何参数)?encodeM1K1M1K1

0 投票
1 回答
57 浏览

haskell - 如何在引入细微差异的同时“重用”另一个类型类的实例定义?

我想以 JSON 格式输出我的应用程序的日志,但是有一些普遍存在的数据类型ToJSON没有定义实例 - 最值得注意SomeException的是整个Exception类型的层次结构。

我有两个选择:

  1. ToJSON在我的应用程序中为此类数据类型定义实例
  2. 编写我自己的类型类,比如ToJsonLogs,并使其ToJSON尽可能地重用实例。

第一个是“阻力最小”的路径,但它还有其他含义。由于类型类实例本质上是全局的,我最终可能会定义ToJSON破坏某些东西的实例。此外,对于相同的数据结构,我可能希望 API 中的 JSON 与日志中的 JSON 不同(例如,清理密钥、授权令牌和其他敏感数据或截断非常长的文本字段)。

这个问题是关于探索第二种选择的。我该如何做以下事情:

我尝试了上述想法,但它在第一步本身就失败了。这是一个示例数据结构:

ToJsonLogs如果不首先推导ToJSON整个数据结构,我就无法推导。由于 的推导ToJSON失败SomeException。因此,这个问题的标题。

我什至试着和泛型鬼混,但像往常一样,又被卡住了

0 投票
2 回答
256 浏览

haskell - 使用 `generics-sop` 导出投影函数

我将如何推导函数

使用类型级字符串 ( Symbol) 从任意记录投影字段,使用generics-sop库?

这类似于通用 SOP 中的检索记录功能,但我有以下问题:

  • OP 没有解释如何走最后一英里来获得我想要的签名。
  • OP 定义了复杂的专用助手类型,我很想避免这种类型
  • 给定的解决方案仅在运行时出错,但编译时匹配应该是可能的,因为类型级别DataTypeInfo是通过DatatypeInfoOf类型族提供的(很高兴拥有,但不是必需的)。

lens-sop软件包似乎也做了类似的事情,但我不知道如何让它为我工作。

我也更喜欢使用类型类的解决方案IsProductType

0 投票
1 回答
59 浏览

haskell - generics-sop:将多态动作提升到产品中

使用该generics-sop库,我具有以下功能:

我如何将它推广到一个n产品,即act在每个位置,多态到返回类型?

相关定义如下:

显而易见的方法是使用pure_NP

如下:

但这不会编译:

因为它期望所有的acts 都是相同的类型,但它们不是:它具有多态类型。

我假设我应该使用cpure_NP,

受约束的版本 pf pure_NP,但我不知道如何设置约束。

0 投票
1 回答
47 浏览

haskell - 带有成分查找和更新的地图记录?

一些伪代码:

我想构建某种看起来像这样的数据结构。从这里,我想:

  • lookup :: Foo k -> k -> Either FailureReason v 个人价值观;如果我们假设我们已经填充了地图,我想要lookup foo a1 :: A1,但也想要传递实例,例如lookup foo a1 :: Bor lookup foo a5 :: A1(因为这是 的简写getA1fromA5 $ lookup foo a5)和lookup foo a5 :: B. 我正在考虑FailureReason = WrongType | NotPresent,但这可能是多余的。
  • 遍历类型,例如(索引的)遍历,(k, D)它应该命中所有内容A3, A4, A5

这可以作为递归搜索来实现,componentMap只要compositeMap它们是手动填充的。

由于上面看起来非常递归,我觉得这有一个GHC.Generics解决方案。可能是lens/optics + generic-lens/generic-optics一个?

还是我的解决方案不需要generics及其同类解决方案,而只是编写一些遍历和镜头来索引我的结构?

那么问题就变成了:这个功能是否已经存在于某个库中?如果没有,Generics我正在寻找实现它的工具吗?