问题标签 [scrap-your-boilerplate]
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.
f# - 在 f# 中报废你的样板文件
我在 Haskell 编程语言中使用了Scrap Your Boilerplate和 Uniplate 库,我发现这种形式的泛型编程在可区分联合上非常有用。f# 编程语言中是否有等效的库?
generics - Data.Data -- 为一个 arity 2 类型的构造函数生成 dataCast1(部分专用)
所以 Data.MapdataCast2
定义了,这是有道理的,因为它有一个 arity 2 类型的构造函数。dataCast1
默认为const Nothing
. dataCast2
很容易定义为gcast2
。
以供参考:
手头的问题是:给定 , 等中的所有内容Data.Data
,Data.Typeable
并给定一个已定义的 arity 2 类型构造dataCast2
函数(例如Map
, 或(,)
),是否有可能编写一个dataCast1
对部分专业化做正确事情的版本这种类型的构造函数,一次用于一个特定的构造函数,还是一般?
直觉上,我认为应该有一个很好的解决方案,但我最初的几次尝试都崩溃了。
haskell - 是否可以使用 SYB 转换类型?
我想编写一个rename
函数,用作为单子中隐藏状态的符号表中的名称(整数)替换我的String
名称(代表分层标识符) 。AST
GUID
Renamer
我有一个AST a
通过名称类型参数化的类型。AST 叶子中的名称类型为Name a
:
这使得使用 SYB 变压器轻松定位它们。
解析器是键入的(为简洁起见忽略错误的可能性):
我希望输入rename
函数:
是否可以使用 SYB 将所有Name String
' 转换为Name GUID
' 与转换器:
以及所有其他值 from c String
toc GUID
通过转换他们的孩子,并使用相同的构造函数将它们粘贴回一起,尽管使用不同的类型参数?
该everywhereM
功能接近我想要的,但它只能转换c a -> m (c a)
而不能c a -> m (c b)
。
我的后备解决方案(除了手动编写样板)是从 中删除类型参数AST
,并定义Name
如下:
以便输入重命名:
使其与everywhereM
. 但是,这会留下 an在重命名后AST
仍然可以持有's的可能性。我想使用类型系统来正式捕获重命名只能包含名称StrName
的事实。AST
GUID
haskell - Haskell 的 Data.Typeable 是什么?
我遇到了对 Haskell's 的引用Data.Typeable
,但我不清楚为什么要在我的代码中使用它。
它解决了什么问题,如何解决?
generics - Clojure 相当于 Haskell 的“Scrap Your Boilerplate”(SYB)
我在 Haskell 中发现了一个有趣的库,名为Scrap Your Boilerplate ,它基于Simon Peyton Jones 的一篇论文,这似乎是一种编写代码的有效方法,可以用函数式编程语言更新大型、深度嵌套的数据结构。它启用如下代码:
这有效地为潜在的庞大而复杂的公司数据结构中的每个人增加了固定比例 k 的工资。
是否有等效的库或方法可以在 Clojure 中实现相同的编程风格?
例如,我如何编写与上面使用的示例等效的 Clojure:
resharper - 用于 CQRS 开发的 Resharper 6 实时模板
ddd-cqrs 列表上有一些关于人们使用 Resharper 实时模板来帮助处理您在进行 CQRS 开发时获得的样板代码的讨论。
这是克服样板疯狂的最佳方式吗?有人想与社区分享吗?
haskell - 了解 Scrap Your Boilerplate 中的 cast 运算符的类型
在 Laemmel 和 SPJ 的 2003 Scrap Your Boilerplate 论文中,第 3 页有一个代码片段
然后论文解释了
也就是说,如果 x 的类型与 f 的参数类型相同,则 mkT fx 将 f 应用于 x
按照本文前面示例的模式,我认为cast f
必须将 的类型与上面的类型Maybe (b -> b)
进行比较才能评估为Just g
,但这似乎不正确。
这里的签名是怎么回事cast f
?
generics - 避免不属于 Haskell 类的样板文件
我正在开发人工生命实验的框架。该框架可以支持多个物种,只要每个物种都是代理类的一个实例。我将每个 Agent 包装在一个 AgentBox 中,这样我就可以在不知道底层类型的情况下读取、写入和使用它们。
这很好用,但是框架的用户必须编写一个小的样板函数。我很想知道是否有办法避免这种情况。我无法在 Agent 类中提供该函数的默认实现,因为该函数的类型签名没有提及类型变量。我可以忍受样板,但我很想知道是否有更好的方法。
这是我正在谈论的最小工作示例。最后的 getRock 函数是我希望避免强迫我的用户编写的函数。Agent 类的每个实例都需要提供一个函数来读取代理并将其包装在一个盒子中,并且实现看起来总是与 getRock 完全一样。
haskell - 如何为第三类型构造函数(ext3)的类型扩展定义 SYB 函数?
在Scrap Your Boilerplate 包中Data.Generics.Aliases
,有一些函数允许对一元和二元类型构造函数进行类型扩展。ext1
特别是和有定义ext2
。
现在,ext1
和是根据, 和ext2
定义的,它们是类型类的一部分,通常由机器定义。但是,没有,所以我看不到一个简单的方法来定义。dataCast1
dataCast2
Data
DeriveDataTypeable
dataCast3
ext3
是否可以定义ext3
,如果可以,如何定义?
haskell - 当前的 SYB 是否允许使用新类型扩展泛型函数?
前 两篇Scrap Your Boilerplate 论文描述了一种编写通用函数的方法,该函数适用于一般类型,但对特定类型有特殊情况。例如,fromJSON
在aeson
包中,定义了一个用于从 JSON 转换的通用函数,但为 list 或 等类型提供了特殊情况Int
:
然而,正如第三篇 SYB 论文所指出的,“当泛型函数定义的递归结被捆绑时,所有类型特定的情况 [需要] 立即提供”。然后论文提出了一种通过类型类机制来解除这种限制的方法。
前两篇 SYB 论文是(经过一些修改)syb
包的一部分,但第三篇不是。是否有其他方法可以解除在 Hackage 上实施 SYB 时需要同时指定所有特定类型案例的限制?