- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 DerivingVia
为具有函数依赖关系的多参数类型类削减实例定义的样板。
我有这些类型和类:
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DerivingVia #-}
newtype Wrapper t = Wrapper t
newtype Wrapper2 t = Wrapper2 t
class MyEq a f | a -> f where
eq :: a -> a -> f Bool
-- Instance for 'Wrapper2'
instance Eq t => MyEq (Wrapper2 t) Wrapper2 where
eq (Wrapper2 t) (Wrapper2 t') = Wrapper2 (t == t')
MyEq (Wrapper Int) Wrapper
使用
deriving via
.
deriving via Wrapper2 instance MyEq (Wrapper Int) Wrapper
MyEq (Wrapper Int) Wrapper2
例如,第二个参数已“更改”,但第一个参数仍然是
Wrapper Int
.
instance MyEq (Wrapper Int) Wrapper2
不存在,因为我实现了
instance MyEq (Wrapper2 Int) Wrapper2
.
Wrapper
作为第一个类型参数):
-- Instance for 'Wrapper2'
instance Eq t => MyEq (Wrapper t) Wrapper2 where
eq (Wrapper2 t) (Wrapper2 t') = Wrapper2 (t == t')
Wrapper t -> Wrapper2
不被尊重。
eq :: f a -> f a -> f Bool
轻松解决问题并删除功能依赖项,但我想避免更改此 API。
最佳答案
所以首先,让我们重复一遍,你想为你派生的实例是这个:
instance MyEq (Wrapper Int) Wrapper where
eq (Wrapper t) (Wrapper t') = Wrapper (t == t')
class MyEq f a | a -> f where
aeq :: a -> a -> f Bool
aeq
保留相同的类型,但
MyEq
的类参数被翻转。
Wrapper2
获取一个额外的参数让我们指定所需的值
f
推导时:
newtype Wrapper2 (f :: Type -> Type) t = Wrapper2 t
Wrapper2
的实例无需明确指定即可定义
f
:
instance (Eq t, Coercible Bool (f Bool)) => MyEq f (Wrapper2 f t) where
eq (Wrapper2 t) (Wrapper2 t') = coerce (t == t')
Wrapper2
中的额外参数这里需要满足函数依赖。
deriving via Wrapper2 Wrapper Int instance MyEq Wrapper (Wrapper Int)
instance MyEq Wrapper (Wrapper2 Wrapper Int)
,这与我们拥有的相匹配
class MyEq a where
type Result a :: Type -> Type
eq :: a -> a -> Result a Bool
Wrapper2
带有额外的参数。实例变成
instance (Eq t, Coercible Bool (f Bool)) => MyEq (Wrapper2 f t) where
type Result (Wrapper2 f t) = f
eq (Wrapper2) (Wrapper2 t') = coerce (t == t')
deriving via Wrapper2 Wrapper Int instance MyEq (Wrapper Int)
关于Haskell DerivingVia 在多参数类型类上的乐趣 deps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009549/
我使用 go dep 工具版本 v0.4.1,现在当我运行 dep init 时它会按预期创建 2 个文件,当我打开 gopkg.lock 我发现例如以下内容 [[projects]] name
运行 dep ensure 后,go-chi 缺少中间件子包。 project-backend | main.go:8:2: cannot find package "github.com/
我正在查看新架构组件的 google 示例,在那里我找到了如下代码: dependencies { // Support libraries implementation deps.s
我有一个包含 2 个项目的 Visual Studio 解决方案,都在 .Net Core 3.1 中 XYZ.Api, Xyz.ApiTests ApiTests 是一个用于集成测试的 xUnit
我正在使用 Rails 3.1 beta 以及 Ruby 1.9.2 和 rake 0.9.2,并且我编写了一堆 rake 任务。这是一个例子: namespace :data do desc "
请遵循以下菜单顺序: 文件->新建->项目-> ASP> .NET核心Web应用程序(.Net Framework) 构建->构建解决方案 得到这个错误: 错误C:\ Users \ Sam \ Do
我正在考虑尝试一些 jit 编译(只是为了学习),因为我在家里运行所有主要的三个(windows、os x、linux),所以让它跨平台工作会很好。 考虑到这一点,我想知道是否有任何方法可以摆脱使用虚
是否可以检查是否启用了数据执行保护? 有没有和这个CMD命令一样的功能 wmic OS Get DataExecutionPrevention_SupportPolicy 然后返回这样的东西? 0 –
当运行我们的一个软件时,测试人员面临着 Windows 的数据执行阻止对话框。 我们尝试在开发人员计算机上重现这种情况以进行调试:但没有成功。 有谁知道如何找到可能导致 DEP 保护终止应用程序的原因
我们有一个应用程序,其中堆的某些部分作为汇编指令执行/用于测试目的 - 我们将程序下载到 PLC,但允许用户通过在下载到 PLC 之前执行他们的代码来模拟运行他们的应用程序。之前我们总是从存储指令的堆
我已经使用以下命令安装了 httprouter 包 dep ensure -add github.com/julienschmidt/httprouter vendor └
我正在尝试使用 DerivingVia为具有函数依赖关系的多参数类型类削减实例定义的样板。 我有这些类型和类: {-# LANGUAGE FunctionalDependencies #-} {-#
我有一个查询,可以有效地返回特定标签的依赖项的所有标签。我想知道这些依赖项的实际文件路径。 $ bazel query 'deps(//foo:bar)' --noimplicit_deps //ba
我们正在使用 rebar 为我们的项目拉取依赖项,其中许多来自 github。我们的配置看起来像: {deps, [ {cowboy, "", {git, "git://github.
在客户端我有这个: var Coll1 = new Meteor.Collection('myCollection1'); var Coll2 = new Meteor.Collection('myC
我需要确定 Windows DEP 是否被禁用,是否设置为基本的 Windows 程序和服务或除我选择的程序之外的所有程序。 我一直在寻找一种方法,但没有成功。有没有办法做到这一点?用 C# 开发。
我想在我的 elixir 应用程序的测试中使用我的依赖项之一的测试目录中的模块。我想知道是否有办法做到这一点。谢谢。 我试过import ,这给了我一个编译错误 elixir module is n
我正在使用 kubebuilder创建 Kubernetes 运营商项目。运行 quickstart guide 中描述的项目初始化命令后 kubebuilder init --domain k8s.
我刚刚开始使用 cloudstack,想要让开发环境运行起来。我安装了 Maven,并使用 Eclipse。我一直在关注this指南,这似乎有点过时,但我一直无法找到有关在 Eclipse 中实现此操
谁能告诉我lein deps是如何工作的?如果lein在~/.m2中找到项目所需版本的依赖项,lein仍然会再次下载相同的包? 最佳答案 让我们将其分为几个问题,我将尝试对每个问题进行简要介绍: 有人
我是一名优秀的程序员,十分优秀!