- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在库中做一些魔术,允许多态地解构产品类型。这是一个或多或少的工作模型,说明了我想做的事情:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
newtype Wrapped a = Wrapped { unwrap :: a }
-- our example structure
ex :: (Int, (Int, Int))
ex = (1,(2,3))
class WrapDecomp x y | y -> x where
decomp :: x -> y
instance (WrapDecomp x x', WrapDecomp y y')=> WrapDecomp (x,y) (x',y') where
decomp (x,y) = (decomp x, decomp y)
instance WrapDecomp x (Wrapped x) where
decomp = Wrapped
example = let w = decomp ex
(w0, w1) = decomp ex
(w0', (w1', w2')) = decomp ex :: (Wrapped Int, (Wrapped Int, Wrapped Int))
in print $ ( unwrap w, unwrap w0, unwrap $ snd w1, unwrap $ fst w1 )
-- Also works:
-- in print $ ( unwrap w, unwrap w0, unwrap w1 )
Wrapped
类型构造函数未导出 unwrap
全部Wrapped
绑定(bind)中的数据(因为我的应用程序的细节很无聊),所以在实践中不应该有歧义UndecidableInstances
还不错,但我想在继续之前确定以上内容是否符合犹太教规。
TypeFamilies
解决我的问题如下:
{-# LANGUAGE TypeFamilies #-}
class Out a where
type In a :: *
decomp :: In a -> a
instance Out (Wrapped a) where
type In (Wrapped a) = a
decomp = Wrapped
instance (Out a, Out b)=> Out (a,b) where
type In (a,b) = (In a,In b)
decomp (x,y) = (decomp x, decomp y)
最佳答案
使用UndecidableInstances
总的来说,只有犹太洁食,什么UndecidableInstances
确实是允许类型检查器在无法提前证明它将完成时尝试解析实例。如果是这样,则代码的安全性不亚于可以提前证明终止的情况。
但是,对于您的实例,您可以创建一种情况,其中类型检查器将使用导致约束 WrapDecomp x (x,y)
的表达式循环。 , 例如
foo x = [fst $ decomp x, x]
fst
需要
decomp x
输入
(a,b)
对于某些类型
a
和
b
,因此是
instance WrapDecomp t (a,b)
在哪里
t
是
x
的类型.在同一个列表中需要
x
有胶带
a
也是,所以一个
instance WrapDecomp a (a,b)
instance (Wrapdecomp x x', WrapDecomp y y') => WrapDecomp (x,y) (x',y')
a = (x,y)
对于某些类型
x
和
y
和
foo
的约束变成
WrapDecomp (x,y) ((x,y),b)
WrapDecomp y b
WrapDecomp x (x,y)
关于haskell - 使用 UndecidableInstances 可以吗?备择方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811251/
我正在尝试将 tslib 嵌入到 ARM 系统中,以便使用触摸屏设备;我已经成功安装了它,但不幸的是我无法检索所有笔记来再次安装它。 x) 我交叉编译了库文件,并将它们放入 /usr/lib ;我已经
我正在尝试开发 Linux 设备驱动程序,作为我的第一次尝试,我正在尝试开发具有以下文件选项的字符设备驱动程序, struct file_operations fops{ .open=open_fu
我们在 IoT Agent Ultralight 中发现了一个错误。 如果我们尝试向不存在的设备发送测量值,我们将收到 404 - DEVICE_NOT_FOUND 错误,但同时将在 IoTA 和 O
我有一个 d3dDevice: ComPtrd3dDevice; 我在这里将它用于 dxgiDevice: ComPtr dxgiDevice2; HRESULT hr; hr
我正在尝试开发 Linux 设备驱动程序,作为我的第一次尝试,我正在尝试开发具有以下文件选项的字符设备驱动程序, struct file_operations fops{ .open=open_fu
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我在 Vagrantfile 中使用以下行创建了一个 hostonly 网络 config.vm.network :hostonly, "10.1.1.15" 我可以看到它设置了/etc/networ
我在 Vagrantfile 中使用以下行创建了一个 hostonly 网络 config.vm.network :hostonly, "10.1.1.15" 我可以看到它设置了/etc/networ
当我在应用程序中添加设备时,我想在 IoT 中心创建一个设备。 我正在寻找可用于执行操作的 REST 端点。或任何可用于执行此操作的 SDK。 最佳答案 查看以下文档: Service - Creat
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!