- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写代码来从元组链中删除空元组。编译器拒绝该程序:
代码:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}
infixr 9 :*
data a :* b = a :* !b
deriving (Show, Eq, Ord)
class Flatten a b | a -> b where
flatten :: a -> b
instance Flatten a a where
flatten = id
instance Flatten a b => Flatten (() :* a) b where
flatten (() :* y) = flatten y
instance Flatten b c => Flatten (a :* b) (a :* c) where
flatten (x :* y) = x :* flatten y
test :: Int :* ()
test = flatten $ 0 :* ()
<小时/>
[1 of 1] Compiling Main ( Test\Test.hs, interpreted )
Test\Test.hs:26:8:
Overlapping instances for Flatten (Int :* ()) (Int :* ())
arising from a use of `flatten'
Matching instances:
instance [overlap ok] Flatten a a
-- Defined at Test\Test.hs:15:10-20
instance [overlap ok] Flatten b c => Flatten (a :* b) (a :* c)
-- Defined at Test\Test.hs:21:10-49
In the expression: flatten
In the expression: flatten $ 0 :* ()
In an equation for `test': test = flatten $ 0 :* ()
Failed, modules loaded: none.
目标:
flatten (0:*():*1:*2:3:*():*():*4:*()) == (0:*1:*2:*3:*4:*())
最佳答案
好吧,首先:编译器提示fundeps冲突的原因是......因为它们确实冲突。确实没有办法解决这个问题,因为冲突是你想要做的事情所固有的。第一个类型参数是“输入”,您本质上是针对特定类型对其进行模式匹配,并重叠给出默认的失败情况。但是第二个“输出”类型参数需要根据“输入”而变化,其方式在特定情况和默认情况之间有所不同,因此会发生冲突。
要解决此问题,您需要使用一些技巧,利用 GHC 在选择实例时仅检查实例头,然后再检查上下文这一事实应用额外的约束。该技巧的核心是完全未指定“输出”类型,以便实例选择仅检查第一个参数,并认为第二个参数对于所有实例都是相同的,同时将某些内容放入上下文中,将第二个参数与所需的“事后输出”。
在当前 GHC 版本中使用此技术的最简单方法是启用类型族并获得 ~
等式约束功能。这是一个例子:
instance (() ~ r) => Flatten (() :* ()) r where
flatten _ = ()
instance (Flatten a r) => Flatten (() :* a) r where
flatten (_ :* rest) = flatten rest
instance (a ~ r) => Flatten (a :* ()) r where
flatten (x :* _) = x
instance ((a :* c) ~ r, Flatten b c) => Flatten (a :* b) r where
flatten (x :* rest) = (x :* flatten rest)
instance (a ~ r) => Flatten a r where
flatten x = x
为了说明模式,我在每个实例中都使用了这个技巧,即使不是绝对必要。我们可以定义您想要的输入:
test = (0 :* () :* 1 :* 2 :* 3 :* () :* () :*4 :* ())
然后,在 GHCi 中:
∀x. x ⊢ flatten test
0 :* (1 :* (2 :* (3 :* 4)))
现在,您可能想知道为什么我在 GHCi 之外定义 test
。不幸的是,如果应用于多态输入类型,上述实例仍然会失败,并且从文件加载它会导致单态限制和类型默认将所有数字文字转换为整数>。不过,对于这种歧义,我们确实无能为力,因为可以匹配多个输入的类型参数确实是不明确的。
作为历史记录,您可以在没有 ~
的情况下完成相同的技巧,仅使用fundeps和GHC的奇怪怪癖。大量 absurd 的类型黑客技术需要某些版本,而原始版本是由 Oleg 发明的(不出所料),其名称有点误导性 TypeCast
,并用于实现相等谓词 TypeEq
是 HList 之类的基础。
关于haskell - 重叠实例以展平元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8766953/
您好,我有一个使用 JSON.Stringify 输出到此的对象 {"0":["test1","ttttt","","","","","","","",""],"1":["test2","ghjgjh
我有以下数据框,它是执行 groupby + 聚合总和的结果: df.groupby(['id', 'category']).agg([pd.Series.sum])
我有一个 3D 三角形带(见插图)。三角形不在一个平面内。 我想展平三角形带,使所有三角形都位于第一个三角形的平面内。 计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内
简单地说,我正在寻找可在 iOS 上使用的与 NSBezierPath 的 -bezierPathByFlatteningPath 等效的方法。这对我来说是直接处理 CGPath 的函数还是 UIBe
假设我有以下 JToken: @"{ ""data"": [ { ""company"": { ""ID"": ""12
如果我在多个分支中处理单个功能,我会使用 git pull branch1 branch2 branch3 将所有更改 pull 入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁
这个问题在这里已经有了答案: How do I make a flat list out of a list of lists? (33 个答案) 关闭6年前。 假设我们有一个返回列表(或有限迭代器)
给定如下模式: root |-- first_name: string |-- last_name: string |-- degrees: array | |-- element: struc
我有一个包含多个列的表,其中一些列是相同长度的数组。我想解除它们的嵌套,以获得包含来自不同行中的数组的值的结果。 所以有这样一张 table : 我想去: 这是其中一个数组列的工作方式: WITH d
我最近买了一台 RICOH THETA S,用于在 360 vr 中录制足球比赛。 我想使用 ffmpeg 将我用我的相机录制的鱼眼电影展平,这可能吗? enter image description
这是我的 question 的后续.是否可以将表格展平为如下所示,而不是数据透视表: data = {'year': ['2016', '2016', '2015', '2014', '2013'],
我目前正在将我的 jruby/java2d 图形绘制/布局应用程序移植到 macruby/cocoa。因此我需要获取开放的 NSBezierPath 与封闭的 NSBezierPath 的交点。 在
是否有一种简单的方法来展平一组 try 以给出尝试值的成功或失败? 例如: def map(l:List[Int]) = l map { case 4 => Failure(new Excepti
我有一个包含数百万行的“服务”表。每行对应于工作人员在给定日期和时间间隔内提供的服务(每行都有一个唯一的 ID)。在某些情况下,工作人员可能会在重叠的时间范围内提供服务。我需要编写一个查询来合并重叠的
我在使用Elastic Search(ES)检索JSON对象时遇到问题。现在,当我尝试使用下面的请求正文从ES查询一些数据时, "_source": [ "data.id", "dat
我有一个订单流(来源是订单列表)。每个订单都有一个 Customer 和一个 OrderLine 列表。 我想要实现的是拥有一个以客户为键的 map ,以及属于该客户的所有订单行,在一个简单的列表中作
给定一个如下所示的复杂对象: case class Complex ( id: Long, name: String, nested: Seq[Complex] ) 实际上,这可能会变成这
我很好奇你如何将数组 Promise 映射的结果展平。我有一个函数 Promise.maps 一组值,它们本身就是 promise (需要解析)并返回一个数组。所以,我得到类似的结果: [ [1, 2
我是 CouchDB 的新手,我只是想评估它在常见任务中的实用性。其中一项任务是生成报告。我的问题是:如果我有这样的文档结构: { "_id": "29763f342ab34fd7b579fd4
假设我们有这样的 map : %{"a": %{"b": 2, "c":5}, "d": 1} 有没有类似this function的东西(js回答同一问题)内置elixr? 最终结果应该是: %{"
我是一名优秀的程序员,十分优秀!