- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的 pipes
库编写一个类型类,以定义类 Proxy
类型的抽象接口(interface)。类型类看起来像:
class ProxyC p where
idT :: (Monad m) => b' -> p a' a b' b m r
(<-<) :: (Monad m)
=> (c' -> p b' b c' c m r)
-> (b' -> p a' a b' b m r)
-> (c' -> p a' a c' c m r)
... -- other methods
我还在为 Proxy
类型编写扩展,其形式为:
instance (ProxyC p) => ProxyC (SomeExtension p) where ....
...并且我希望这些实例能够施加额外的约束,即如果 m
是 Monad
则 p a' a b' b m
是所有 a'
、a
、b'
和 b 的
.Monad
但是,我不知道如何将其干净地编码为 ProxyC 类或实例的约束。我目前知道的唯一解决方案是在类的方法签名中对其进行编码:
(<-<) :: (Monad m, Monad (p b' b c' c m), Monad (p a' a b' b m))
=> (c' -> p b' b c' c m r)
-> (b' -> p a' a b' b m r)
-> (c' -> p a' a c' c m r)
...但我希望有一个更简单、更优雅的解决方案。
编辑:即使最后一个解决方案也不起作用,因为编译器不会推断出 (Monad (SomeExtension p a' a b' b m))
意味着 ( Monad (p a' a b' b m))
用于特定的变量选择,即使给出以下实例:
instance (Monad (p a b m)) => Monad (SomeExtension p a b m) where ...
编辑#2:我正在考虑的下一个解决方案只是在 ProxyC
类中复制 Monad
类的方法:
class ProxyC p where
return' :: (Monad m) => r -> p a' a b' b m r
(!>=) :: (Monad m) => ...
...然后使用每个 ProxyC 实例实例化它们。这对于我的目的来说似乎没问题,因为 Monad 方法只需要在内部用于扩展编写,并且原始类型仍然为下游用户提供适当的 Monad 实例。所有这一切只是将 Monad
方法公开给实例编写器。
最佳答案
实现此目的的一个相当简单的方法是使用 GADT 将证明移至值级别
data IsMonad m where
IsMonad :: Monad m => IsMonad m
class ProxyC p where
getProxyMonad :: Monad m => IsMonad (p a' a b' b m)
您需要在需要的地方显式打开字典
--help avoid type signatures
monadOf :: IsMonad m -> m a -> IsMonad m
monadOf = const
--later on
case getProxyMonad `monadOf` ... of
IsMonad -> ...
使用 GADT 来通过命题证明的策略确实非常通用。如果您可以使用约束类型,而不仅仅是 GADT,则可以使用 Edward Kmett 的 Data.Constraint
包
class ProxyC p where
getProxyMonad :: Monad m => Dict (Monad (p a' a b' b m))
它可以让你定义
getProxyMonad' :: ProxyC p => (Monad m) :- (Monad (p a' a b' b m))
getProxyMonad' = Sub getProxyMonad
然后使用一个奇特的中缀运算符告诉编译器在哪里寻找 monad 实例
... \\ getProxyMonad'
事实上,:-
蕴涵类型形成了一个类别(其中对象是约束),并且这个类别有很多很好的结构,也就是说它用来做证明非常好。
附:这些片段都没有经过测试。
编辑:您还可以将值(value)级别证明与新类型包装器结合起来,而无需到处打开 GADT
newtype WrapP p a' a b' b m r = WrapP {unWrapP :: p a' a b' b m r}
instance ProxyC p => Monad (WrapP p) where
return = case getProxyMonad of
Dict -> WrapP . return
(>>=) = case getProxyMonad of
Dict -> \m f -> WrapP $ (unWrapP m) >>= (unWrapP . f)
instance ProxyC p => ProxyC (WrapP p) where
...
我怀疑,但显然没有测试过,这个实现也会相对有效。
关于haskell - 约束类型类或实例的派生变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485403/
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!