问题标签 [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.
haskell - 使用 GHC.Generics 提取 Id
如何使用从结构中提取标识符(在本例中为整数)GHC.Generics
?
我有一个Id
类型:
以及许多使用该类型的类型:
除此之外,还有其他类型可以包装上述类型,例如标识符:
现在我需要_id
从这些包含Id
值的任何类型中提取字段。目前我们有大量的样板,我想使用泛型将其废弃。
一开始我想定义一个类:
这样,只有当内部有一个这样的类型时,你才会有一个Identifiable
实例(如果上面有多个这样的类型,我们返回从上到下遍历结构时找到的第一个)。现在,当我尝试为产品和总和定义实例时,问题就来了。我想表达类似的东西:Id
FuncId
Id
GIdentifiable
这不起作用,因为我正在定义重复的实例。
我可以重新定义Identifiable
,getId :: e -> Maybe Id
但这会删除一些类型安全,并在我知道一个类型至少包含一个时引入不必要的检查Id
。
在使用类型系统时,有没有办法表达这种案例分析?
haskell - 使用类型族和泛型查找 Id 值
这个问题与这个问题有关,我想避免Id
从数据结构中提取值的样板,但以类型安全的方式。
我将在这里重复问题的相关细节:假设您有一个类型Id
:
并且您想定义一个函数,该函数从任何包含至少一个值的结构getId
中提取它:Id
Id
现在的问题是如何以类型安全的方式定义这样的类,同时避免使用泛型的样板。
在我之前的问题中,我提到了类型系列,特别是这篇博文中描述的想法。据我了解,这个想法是定义一个类型类MkIdentifiable
,以便:
一个值只有在其中嵌套Res
了至少一个值时才属于类型:Id
然后,似乎可以定义:
现在的问题是如何定义Res
与 GHC.Generics ( U1
, K1
, :*:
, :+:
) 的类型相关联的类型族。
我尝试了以下方法:
哪里Choose
会像上述博客文章中定义的那样:
但这不会像HasId (l p)
has kind那样编译,Res
而是需要一个类型。
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 -> *
任何关于阅读什么以便理清思路的提示都将不胜感激。完整的解决方案也是可以接受的:)
haskell - 用简单求和类型的所有值构造一个 n 元积
我正在使用generics-sop库。我想写一个具有以下类型的值:
也就是说,对于构造函数没有任何参数 ( IsEnumType
) 的 sum 类型,我想生成一个 n 元乘积 ( NP
),它在每个点都包含相应的构造函数值。
例如,对于类型
我想生产 n 元产品
我相信解决方案将涉及转换带有每个构造函数的通用表示的 n 元乘积,所以我写了这个:
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
这是不可能的?如果是后者,这是否意味着也无法创建一个允许自动派生任何类型的库,因为我找不到这样的库。Unbox
Storable
Unbox
Storable
我问是因为理想情况下我想避免使用模板 Haskell 和使用vector-th-unbox
.
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
给出的教程,由于参数被传递给函数,它允许人们有机会解开/构造函数并构建一些有意义的递归层次结构。如何为我的用例编写泛型(泛型函数实际上没有任何参数)?encode
M1
K1
M1
K1
haskell - 如何在引入细微差异的同时“重用”另一个类型类的实例定义?
我想以 JSON 格式输出我的应用程序的日志,但是有一些普遍存在的数据类型ToJSON
没有定义实例 - 最值得注意SomeException
的是整个Exception
类型的层次结构。
我有两个选择:
ToJSON
在我的应用程序中为此类数据类型定义实例- 编写我自己的类型类,比如
ToJsonLogs
,并使其ToJSON
尽可能地重用实例。
第一个是“阻力最小”的路径,但它还有其他含义。由于类型类实例本质上是全局的,我最终可能会定义ToJSON
破坏某些东西的实例。此外,对于相同的数据结构,我可能希望 API 中的 JSON 与日志中的 JSON 不同(例如,清理密钥、授权令牌和其他敏感数据或截断非常长的文本字段)。
这个问题是关于探索第二种选择的。我该如何做以下事情:
我尝试了上述想法,但它在第一步本身就失败了。这是一个示例数据结构:
ToJsonLogs
如果不首先推导ToJSON
整个数据结构,我就无法推导。由于 的推导ToJSON
失败SomeException
。因此,这个问题的标题。
我什至试着和泛型鬼混,但像往常一样,又被卡住了。
haskell - 使用 `generics-sop` 导出投影函数
我将如何推导函数
使用类型级字符串 ( Symbol
) 从任意记录投影字段,使用generics-sop
库?
这类似于通用 SOP 中的检索记录功能,但我有以下问题:
- OP 没有解释如何走最后一英里来获得我想要的签名。
- OP 定义了复杂的专用助手类型,我很想避免这种类型
- 给定的解决方案仅在运行时出错,但编译时匹配应该是可能的,因为类型级别
DataTypeInfo
是通过DatatypeInfoOf
类型族提供的(很高兴拥有,但不是必需的)。
该lens-sop
软件包似乎也做了类似的事情,但我不知道如何让它为我工作。
我也更喜欢使用类型类的解决方案IsProductType
。
haskell - generics-sop:将多态动作提升到产品中
使用该generics-sop
库,我具有以下功能:
我如何将它推广到一个n产品,即act
在每个位置,多态到返回类型?
相关定义如下:
显而易见的方法是使用pure_NP
如下:
但这不会编译:
因为它期望所有的act
s 都是相同的类型,但它们不是:它具有多态类型。
我假设我应该使用cpure_NP
,
受约束的版本 pf pure_NP
,但我不知道如何设置约束。
haskell - 带有成分查找和更新的地图记录?
一些伪代码:
我想构建某种看起来像这样的数据结构。从这里,我想:
lookup :: Foo k -> k -> Either FailureReason v
个人价值观;如果我们假设我们已经填充了地图,我想要lookup foo a1 :: A1
,但也想要传递实例,例如lookup foo a1 :: B
orlookup 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
我正在寻找实现它的工具吗?