问题标签 [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.
haskell - TypeRep 与“类型”GADT 之间的关系
在Scrap your Boilerplate reloaded 中,作者描述了Scrap Your Boilerplate的新演示文稿,它应该与原版等效。
但是,一个区别是它们假设了一组有限的、封闭的“基本”类型,用 GADT 编码
在最初的 SYB 中,使用类型安全强制转换,并使用Typeable
类实现。
我的问题是:
- 这两种方法之间有什么关系?
- 为什么为“SYB Reloaded”演示选择了 GADT 表示?
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
就是我要找的东西。
generics - 如何使用 GHC.Generics(或其他类似框架)构造泛型 Functor 实例?
我正在尝试学习 GHC 泛型。在查看了几个示例之后,我想尝试创建一个通用Functor
实例(忽略 GHC 可以为我自动派生它们)。但是,我意识到我不知道如何使用泛型处理参数化数据类型,我看到的所有示例都是类似的*
。这是可能的,如果是的话,怎么做?(我也对其他类似的框架感兴趣,比如 SYB。)
haskell - 使用 SYB 和 ad-hoc 多态性在 Haskell 中进行泛型编程
我有一个与Show相同的类,我想为每个元组类型创建一个此类的实例。通常这是通过为每个元组类型单独编写实例来完成的
为每个元组类型编写一个实例会导致大量样板文件,并且很容易看到所有showPrec
实现之间共享的通用模式。为了避免这种样板,我想我可以使用Scrap你的样板中的Data.Generics并实现折叠元组,比如
但showTuple
由于某种原因不起作用
我认为问题在于它show
是多态的,因为如果我专攻showTuple
它,它就会起作用
我检查了gshow的代码,它的功能与我需要的类似,但我不知道它是如何工作的。如果我尝试将其代码导入 GHCI,则会收到错误消息:
所以我有两个问题:
- 有什么问题,
showTuple
我该如何修复它,使其适用于任何大小的元组 - 它是如何
gshow
工作的,为什么如果我在 GHCI 上导入它的代码会出现这个错误?
编辑:我正在学习Data.Generics
,总的来说是 SYM,所以我想使用那个模块。只有当它仅使用该模块时,我才会接受答案。谢谢。
haskell - 使用 GHC.Generics 派生默认实例
我有一个类型类Cyclic
,我希望能够为其提供通用实例。
给定一个 sum 类型的 nullary 构造函数,
我想生成一个与此等效的实例:
我试着Generic
像这样设计出所需的机器
现在我可以提供Cyclic
使用的默认实现GCyclic
:
但我的GCyclic
例子不正确。T3
从上面使用
很清楚为什么rot
等同于id
这里。grot
向下递归 的(:+:)
结构,T3
直到遇到基本情况grot U1 = U1
。
有人建议#haskell
使用构造函数信息,M1
因此grot
可以选择下一个要递归的构造函数,但我不确定如何执行此操作。
是否可以生成所需的Cyclic
usingGHC.Generics
或其他形式的 Scrap Your Boilerplate 实例?
编辑:我可以Cyclic
用Bounded
和写Enum
但是(原样)这是不令人满意的,因为它需要所有Bounded
,Enum
和Eq
. 此外,Enum
在某些情况下,GHC 无法自动导出,而更健壮的Generic
可以。
haskell - Data 实例的通用数据构造函数
给定一个数据类型
什么是简单的定义
这样
它本质上与 syb 的gfindtype
.
还是这样的事情已经存在?我试过 hoogle-ing 类型并没有找到太多,但是 syb 类型有点难以解释。返回Nothing
错误的函数也是可以接受的。
haskell - 报废你的样板
关于SYB,我是初学者
我尝试编写代码以使用代码获取表达式中的变量
whereremoveDuplicate
消除列表中的重复变量
ExprVar
是我的数据类型 数据类型还包括ExprAdd
, Exprsub
, ExprMul
, ExprDiv
,ExprNum
分别表示加法、减法乘法、除法和数字。
我在编译时收到以下错误:
请让我知道我哪里出错了?
谢谢
haskell - SYB(废弃你的样板)相对于 GHC 泛型的优势
与 GHC Generics 相比,是否有任何任务只有 SYB 才能完成,或者更容易完成?
haskell - Haskell中AST的无样板注释?
我一直在摆弄用 Haskell 编写的 Elm 编译器。
我想开始对其进行一些优化,其中一部分涉及遍历 AST 并向某些节点添加“注释”,例如尾调用等。
我知道我可以使用 SYB 或 uniplate 进行遍历,但我想知道是否有一种无样板的方式来处理这些类型。
所以,假设我们的 AST 有一堆代数类型:
如果我正在编写样板文件,我会创建这样的新类型:
这是要编写的大量样板代码,避免这种情况似乎是一种好习惯。
我可以写这样的东西:
然后我就会有一个与 AST 并行运行的注释树。但是不能保证这些树会有相同的结构,所以我们失去了类型安全。
所以我想知道,是否有一种优雅/推荐的解决方案来避免样板,但仍然以类型安全的方式注释树?用等效的节点替换每个节点,加上稍后将在编译中使用的注释列表?
haskell - 在没有样板的情况下从类型 `T a` 转换为 `T b`
所以,我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化
我有注释类型S
和T
,还有一些功能f :: S -> T
。我想在 Expr 值内使用我的转换将其Expr S
转换为一个。Expr T
f
S
有没有办法使用 SYB 或泛型来做到这一点,并避免在每种情况下都进行模式匹配?这似乎是适合的事物类型。我只是对SYB不够熟悉,不知道具体的方法。