问题标签 [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.

0 投票
2 回答
421 浏览

haskell - TypeRep 与“类型”GADT 之间的关系

Scrap your Boilerplate reloaded 中,作者描述了Scrap Your Boilerplate的新演示文稿,它应该与原版等效。

但是,一个区别是它们假设了一组有限的、封闭的“基本”类型,用 GADT 编码

在最初的 SYB 中,使用类型安全强制转换,并使用Typeable类实现。

我的问题是:

  • 这两种方法之间有什么关系?
  • 为什么为“SYB Reloaded”演示选择了 GADT 表示?
0 投票
2 回答
525 浏览

haskell - Haskell's Scrap Your Boilerplate (SYB) - 只应用一次转换而不是到处应用

将转换应用于树一次而不是everywhere使用 SYB 的最佳方法是什么?例如,在下面的简化表达式中,有几个 的实例Var "x",我想用Var "y"only 替换第一个实例。

data Exp = Var String | Val Int | Plus Exp Exp |...

myExp = Val 5 `Plus` Var "x" `Plus` Val 5 `Plus` Var "x" ...

这不能使用everywhere组合器完成,因为它会尝试转换 to 的所有Var "x"实例Var "y"

编辑(发布后):看起来somewhere就是我要找的东西。

0 投票
2 回答
431 浏览

generics - 如何使用 GHC.Generics(或其他类似框架)构造泛型 Functor 实例?

我正在尝试学习 GHC 泛型。在查看了几个示例之后,我想尝试创建一个通用Functor实例(忽略 GHC 可以为我自动派生它们)。但是,我意识到我不知道如何使用泛型处理参数化数据类型,我看到的所有示例都是类似的*。这是可能的,如果是的话,怎么做?(我也对其他类似的框架感兴趣,比如 SYB。)

0 投票
3 回答
488 浏览

haskell - 使用 SYB 和 ad-hoc 多态性在 Haskell 中进行泛型编程

我有一个与Show相同的类,我想为每个元组类型创建一个此类的实例。通常这是通过为每个元组类型单独编写实例来完成的

为每个元组类型编写一个实例会导致大量样板文件,并且很容易看到所有showPrec实现之间共享的通用模式。为了避免这种样板,我想我可以使用Scrap你的样板中的Data.Generics并实现折叠元组,比如

showTuple由于某种原因不起作用

我认为问题在于它show是多态的,因为如果我专攻showTuple它,它就会起作用

我检查了gshow的代码,它的功能与我需要的类似,但我不知道它是如何工作的。如果我尝试将其代码导入 GHCI,则会收到错误消息:

所以我有两个问题:

  1. 有什么问题,showTuple我该如何修复它,使其适用于任何大小的元组
  2. 它是如何gshow工作的,为什么如果我在 GHCI 上导入它的代码会出现这个错误?

编辑:我正在学习Data.Generics,总的来说是 SYM,所以我想使用那个模块。只有当它仅使用该模块时,我才会接受答案。谢谢。

0 投票
1 回答
896 浏览

haskell - 使用 GHC.Generics 派生默认实例

我有一个类型类Cyclic,我希望能够为其提供通用实例。

给定一个 sum 类型的 nullary 构造函数,

我想生成一个与此等效的实例:

我试着Generic像这样设计出所需的机器

现在我可以提供Cyclic使用的默认实现GCyclic

但我的GCyclic例子不正确。T3从上面使用

很清楚为什么rot等同于id这里。grot向下递归 的(:+:)结构,T3直到遇到基本情况grot U1 = U1

有人建议#haskell使用构造函数信息,M1因此grot可以选择下一个要递归的构造函数,但我不确定如何执行此操作。

是否可以生成所需的CyclicusingGHC.Generics或其他形式的 Scrap Your Boilerplate 实例?

编辑:可以CyclicBounded和写Enum

但是(原样)这是不令人满意的,因为它需要所有Bounded,EnumEq. 此外,Enum在某些情况下,GHC 无法自动导出,而更健壮的Generic可以。

0 投票
1 回答
250 浏览

haskell - Data 实例的通用数据构造函数

给定一个数据类型

什么是简单的定义

这样

它本质上与 syb 的gfindtype.

还是这样的事情已经存在?我试过 hoogle-ing 类型并没有找到太多,但是 syb 类型有点难以解释。返回Nothing错误的函数也是可以接受的。

0 投票
1 回答
121 浏览

haskell - 报废你的样板

关于SYB,我是初学者

我尝试编写代码以使用代码获取表达式中的变量

whereremoveDuplicate消除列表中的重复变量

ExprVar是我的数据类型 数据类型还包括ExprAdd, Exprsub, ExprMul, ExprDiv,ExprNum分别表示加法、减法乘法、除法和数字。

我在编译时收到以下错误:

请让我知道我哪里出错了?

谢谢

0 投票
1 回答
486 浏览

haskell - SYB(废弃你的样板)相对于 GHC 泛型的优势

与 GHC Generics 相比,是否有任何任务只有 SYB 才能完成,或者更容易完成?

0 投票
4 回答
1876 浏览

haskell - Haskell中AST的无样板注释?

我一直在摆弄用 Haskell 编写的 Elm 编译器。

我想开始对其进行一些优化,其中一部分涉及遍历 AST 并向某些节点添加“注释”,例如尾调用等。

我知道我可以使用 SYB 或 uniplate 进行遍历,但我想知道是否有一种无样板的方式来处理这些类型。

所以,假设我们的 AST 有一堆代数类型:

如果我正在编写样板文件,我会创建这样的新类型:

这是要编写的大量样板代码,避免这种情况似乎是一种好习惯。

我可以写这样的东西:

然后我就会有一个与 AST 并行运行的注释树。但是不能保证这些树会有相同的结构,所以我们失去了类型安全。

所以我想知道,是否有一种优雅/推荐的解决方案来避免样板,但仍然以类型安全的方式注释树?用等效的节点替换每个节点,加上稍后将在编译中使用的注释列表?

0 投票
2 回答
130 浏览

haskell - 在没有样板的情况下从类型 `T a` 转换为 `T b`

所以,我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化

我有注释类型ST,还有一些功能f :: S -> T。我想在 Expr 值内使用我的转换将其Expr S转换为一个。Expr TfS

有没有办法使用 SYB 或泛型来做到这一点,并避免在每种情况下都进行模式匹配?这似乎是适合的事物类型。我只是对SYB不够熟悉,不知道具体的方法。