- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在类型级别构建一个列表,但在弄清楚如何强制执行约束时遇到了一些麻烦。
我的基本代码是:
data Foo z q = Foo1 (z q)
| Foo2 (z q)
class Qux q -- where ...
class Baz z -- where ...
class Bar a where -- a has kind *->*
type BCtx a q :: Constraint -- using ConstraintKinds to allow constraints on the concrete type
f :: (BCtx a q) => a q -> a q -> a q
g :: (BCtx a q, BCtx a q') => a q -> a q'
instance (Baz z) => Bar (Foo z) where
type BCtx (Foo z) q = (Num (z q), Qux q) -- for example
f (Foo1 x) (Foo1 y) = Foo1 $ x+y -- these functions need access to the type q to do arithmetic mod q
f (Foo1 x) (Foo2 y) = Foo2 $ x-y
-- ...
您可以认为上面的q
代表素数幂。我还想使用 qi 的类型列表来表示合数。我想象的是这样的:
data QList qi qs = QCons qi qs
| QNil
数据
data FList c q = FNil
| FCons (c (Head q)) (FList c (Tail q))
其中(Head q)
应对应于qi
,(Tail q)
应对应于qs
。请注意,FList
的 q
参数(不一定)不是 (Qux q)
,而是一个列表 (Qux qi)
。 (我不想进一步充实这个列表,因为这是我提出的设计问题之一)。我想在 FList
上“按模数”工作:
instance (Bar c) => Bar (FList c) where
type BCtx (FList c) q = () -- Anything I put here is not enough
f (FCons x xs) (FCons y ys) = FCons (f x y) (f xs ys)
-- the left call to `f` calls a concrete instance, the right call to `f` is a recursive call on the rest of the list
-- ...
在 GHC 中将这些代码片段编译在一起会导致(模转录、抽象和打字错误):
Could not deduce (BCtx c (Head q), BCtx c (Tail q))
然后
Could not deduce (BCtx c (Head (Tail q)), BCtx c (Tail (Tail q)))
等等
我知道为什么会出现此错误,但不知道如何修复它。
具体来说,我期待一个 FList c q
类型,其中 c~Foo z
和 q~QCons q1 (QCons q2 QNil)
,当然,我的列表将满足每个级别的所有 BCtx 约束。
我不确定修复这些特定错误是否会导致编译代码,但这是一个开始。整个Bar类基本是固定的(需要Constraint种类,并且Bar的实例必须有kind * -> *)。我不相信我可以使用存在类型来创建通用对象列表,因为我需要访问 qi
参数。我愿意更改 FList
和 QList
的类型,以允许我在一组 Bar 上按模进行工作。
感谢您的宝贵时间!
最佳答案
要处理类型列表,有必要区分空列表和非空列表并分别处理它们。代码中出现“无法推断”错误是因为您的实例假定一个非空列表,而实际上该列表可能为空,也可能不为空。这是使用扩展 TypeFamilies
的解决方案, TypeOperators
, DataKinds
,和GADTs
.
与 DataKinds
,类型列表是预定义的。他们有善良[*]
,但它们将在类型 *
的上下文中使用是预期的,因此需要一个运算符来转换它们:
data InjList (qs :: [*])
使用类型列表,FList
定义为
data FList c q where
FNil :: FList c (InjList '[])
FCons :: c h -> FList c (InjList t) -> FList c (InjList (h ': t))
它被定义为 GADT 来表达如何只能构造 FList
超过类型InjList q'
对于某些类型列表 q'
。例如,术语 FCons [True] FNil
类型为FList [] (InjList (Bool ': '[]))
。另一方面,由于Bool
不是 InjList q'
形式,没有 FList [] Bool
类型的项(⊥ 除外) 。通过 FList
上的模式匹配,函数可以验证它是否被赋予了非⊥参数,并进一步确定它是否被传递了一个空类型列表。
Bar
的一个实例对于 FList
s 必须分别处理 nil 列表和 cons 列表。 nil 列表有一个空的上下文。 cons 列表具有列表头部和尾部的组件。这是通过 BCtx
关联类型实例中的类型列表上的模式匹配来表达的。 。函数f
检查其参数以验证它不是 ⊥ 并确定它是否为空列表。
instance (Bar c) => Bar (FList c) where
-- Empty context for '[]
type BCtx (FList c) (InjList '[]) = ()
-- Context includes components for head and tail of list
type BCtx (FList c) (InjList (h ': t)) = (BCtx c h, BCtx (FList c) (InjList t))
f FNil FNil = FNil
f (FCons x xs) (FCons y ys) = FCons (f x y) (f xs ys)
我们可以将代码加载到 GHCi 中以验证其是否有效:
instance Bar [] where
type BCtx [] q = Num q
f xs ys = zipWith (+) xs ys
instance Show (FList c (InjList '[])) where
show FNil = "FNil"
instance (Show (c h), Show (FList c (InjList t))) => Show (FList c (InjList (h ': t))) where
show (FCons h t) = "FCons (" ++ show h ++ ") (" ++ show t ++ ")"
$ ghci
> :load Test
> f (FCons [1,2] FNil) (FCons [3,4] FNil)
FCons ([4,6]) (FNil)
关于haskell - 带有约束的类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14250212/
我可以添加一个检查约束来确保所有值都是唯一的,但允许默认值重复吗? 最佳答案 您可以使用基于函数的索引 (FBI) 来实现此目的: create unique index idx on my_tabl
嗨,我在让我的约束在grails项目中工作时遇到了一些麻烦。我试图确保Site_ID的字段不留为空白,但仍接受空白输入。另外,我尝试设置字段显示的顺序,但即使尝试时也无法反射(reflect)在页面上
我似乎做错了,我正在尝试将一个字段修改为外键,并使用级联删除...我做错了什么? ALTER TABLE my_table ADD CONSTRAINT $4 FOREIGN KEY my_field
阅读目录 1、约束的基本概念 2、约束的案例实践 3、外键约束介绍 4、外键约束展示 5、删除
SQLite 约束 约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整
我在 SerenityOS project 中偶然发现了这段代码: template void dbgln(CheckedFormatString&& fmtstr, const Parameters
我有表 tariffs,有两列:(tariff_id, reception) 我有表 users,有两列:(user_id, reception) 我的表 users_tariffs 有两列:(use
在 Derby 服务器中,如何使用模式的系统表中的信息来创建选择语句以检索每个表的约束名称? 最佳答案 相关手册是Derby Reference Manual .有许多可用版本:10.13 是 201
我正在使用 z3py 进行编码。请参阅以下示例。 from z3 import * x = Int('x') y = Int('y') s = Solver() s.add(x+y>3) if s.c
非常快速和简单的问题。我正在运行一个脚本来导入数据并声明了一个临时表并将检查约束应用于该表。显然,如果脚本运行不止一次,我会检查临时表是否已经存在,如果存在,我会删除并重新创建临时表。这也会删除并重新
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
我在使用grails的spring-data-neo4j获得唯一约束时遇到了一些麻烦。 我怀疑这是因为我没有正确连接它,但是存储库正在扫描和连接,并且CRUD正在工作,所以我不确定我做错了什么。 我正
这个问题在这里已经有了答案: Is there a constraint that restricts my generic method to numeric types? (24 个回答) 7年前
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
在iOS的 ScrollView 中将图像和带有动态文本(动态高度)的标签居中的最佳方法是什么? 我必须添加哪些约束?我真的无法弄清楚它是如何工作的,也许我无法处理它,因为我是一名 Android 开
考虑以下代码: class Foo f class Bar b newtype D d = D call :: Proxy c -> (forall a . c a => a -> Bool) ->
我有一个类型类,它强加了 KnownNat约束: class KnownNat (Card a) => HasFin a where type Card a :: Nat ... 而且,我有几
我知道REST原则上与HTTP无关。 HTTP是协议,REST是用于通过Web传输hypermedia的体系结构样式。 REST可以使用诸如HTTP,FTP等的任何应用程序层协议。关于REST的讨论很
我有这样的情况,我必须在数据库中存储复杂的数据编号。类似于 21/2011,其中 21 是文件编号,但 2011 是文件年份。所以我需要一些约束来处理唯一性,因为有编号为 21/2010 和 21/2
我有一个 MySql (InnoDb) 表,表示对许多类型的对象之一所做的评论。因为我正在使用 Concrete Table Inheritance ,对于下面显示的每种类型的对象(商店、类别、项目)
我是一名优秀的程序员,十分优秀!