问题标签 [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 - 如何在特殊情况下折叠构造函数?
所以我有一棵树,我想在节点类型的地方折叠
除了少数特殊情况。我想做一些事情
其中所有特殊情况都会生成最后一个情况只是递归折叠的结果列表;但这不起作用,因为作为 gmapQ 的第一个参数的函数必须是类型forall d. Data d => d -> u
而不是Node -> u
,据我所知,这只会限制您仅使用对该Data
类型进行操作的函数。
有没有办法强制问题中的值是正确的类型,或者可能是另一个更宽松的 map 函数?
额外信息:
上述函数的实际代码collapse
命名为validate
,用于在抽象语法树(对于非常简单的语言)中遍历和查找未绑定的变量,特殊情况的处理方式如下
这本质上是文字数字中没有变量的规则,让表达式绑定一个变量,并且需要检查变量是否绑定。这种玩具语言中的所有其他构造只是数字和变量的组合(例如求和、乘法等),因此当我检查未绑定的变量时,我只需要遍历它们的子树并组合结果;因此gmapQ
.
额外信息2:
Node
代替上面示例的实际数据类型为
haskell - 废弃在表达式中进行变量替换的样板
假设我们有以下数据结构,其值表示某种语言的表达式:
我想定义一个函数substBExpr
,用它们在 a 中的整数值替换变量名BExpr
。这可以按如下方式完成:
问题是这需要很多样板,我想避免。
我现在可以想到两种解决方案。第一个解决方案是添加一个类型参数,BExpr
以便我可以自动Functor
为它派生一个实例:
虽然这可行,但如果Bexpr
无法更改以包含类型参数,则它是不可行的。
第二种解决方案是使用gfoldl
:
这涉及到它自己的一些样板(但我不知道任何遍历结构的函数,并且只有当它们可以转换为特定类型时才将函数应用于结构内的值)。
对于这个“废弃你的样板”问题,是否有更好的替代方案?(我可以想象它可能是一些涉及镜头的解决方案,但我对光学不太熟悉......)。
haskell - 仅在少数情况下遍历多态结构并执行转换
假设我们用以下方式表示公司层次结构:
我想定义一个功能,它可以提高公司资产的工资,这些资产没有Boss
祖先的部门有Bad
业绩。这样的函数可以很容易地定义如下:
问题是这需要很多样板文件(为了讨论,请假设CompanyAsset
已给出且无法更改)。
所以我的问题是是否有一种遍历数据结构的方法可以避免上面的样板。
这个问题与我发布的一个类似问题有关,但在这种情况下使用everywhere'
不会有帮助,因为在某些情况下不应该提高工资。
haskell - 根据参数和请求的返回类型返回部分产品或记录的函数
我正在寻找一个函数,在给定必要的返回类型的情况下,它将完全基于传递给函数的类型的结构返回与该类型匹配的产品参数部分。
例如:
同样,对于相同的功能func
,但不同的产品:
有这样的功能吗?我觉得这应该是可能的,也许使用Generic
. 我知道这在其他语言中是可能的,例如带有 Shapeless 库的 Scala,但我不知道如何在 Haskell 中最好地解决这个问题。
haskell - 如何使用 Data.Data?
由于我不熟悉 rank-N 类型,因此类型签名gfoldl
对我来说很麻烦:
我能想到的唯一功能是\xs y -> ($y) <$> xs
和pure
,分别。
其他功能如gunfold
和gmapT
也有类似问题。那么它们的重要用途有哪些值得注意的例子呢?
haskell - 在 SYB 中匹配更高种类的类型
一般来说,我想知道是否有一种方法可以编写通用折叠来概括应用以下forall
类型的函数:
给定一些数据类型D
(instance Data (D a)
可能对 有约束a
)。具体来说,考虑一些简单的事情False `mkQ` isJust
,或者一般来说,对更高种类数据类型的构造函数的查询。类似地,考虑一个mkT (const Nothing)
只影响一种特定的高级类型的转换。
如果没有明确的类型签名,它们就会失败No instance for Typeable a0
,这可能是工作中的单态限制。很公平。但是,如果我们添加显式类型签名:
相反,我们被告知forall
外部签名的类型不明确:
我无法解决这个问题。如果我真的正确理解那a0
是变量t :: forall a0. Data a0 => a0 -> a0
,它怎么比说更模棱两可mkT not
?如果有的话,我本来会mkT
抱怨的,因为它是与isJust
. 此外,这些函数比具体类型的分支更具多态性。
我很想知道这是否是证明内部约束的限制isJust :: Data a => ...
——我的理解是,任何类型的实例Data
都Maybe a
必须Data a
由实例约束有效instance Data a => Data (Maybe a)
。