- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 新手,只是玩了一段时间。
我编写了一个轻量级的 OOP 模拟:
--OOP.hs
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances, ScopedTypeVariables, FunctionalDependencies #-}
module OOP where
class Provides obj iface where
provide::obj->iface
(#>)::obj->(iface->a)->a
o #> meth = meth $ provide o
class Instance cls obj | obj -> cls where
classOf::obj->cls
class Implements cls iface where
implement::(Instance cls obj)=>cls->obj->iface
instance (Instance cls obj, Implements cls iface)=>Provides obj iface where
provide x = implement (classOf x::cls) x
像这样使用它:
--main.hs
{-# LANGUAGE MultiParamTypeClasses #-}
import OOP
data I1 = I1
getI1::I1->String
getI1 i1 = "Interface 1"
data I2 = I2
getI2::I2->String
getI2 i2 = "Interface 2"
data C = C
instance Implements C I1 where
implement C o = I1
instance Implements C I2 where
implement C o = I2
data O = O
instance Instance C O where
classOf o = C
main = do
putStrLn (O #> getI1)
putStrLn (O #> getI2)
我读到 UndecidableInstances
功能非常不方便,并且可能导致 stack overflows在编译器中。所以我有两个问题。
1 到 N
关系?最佳答案
在这种情况下,您使用不可判定的实例是可以的。
instance (Instance cls obj, Implements cls iface)=>Provides obj iface where
是不可判定的,因为您可能有一个 Instance
或 Implements
的实例,而这些实例又依赖于 Provides
导致循环。
但是,在这种情况下,您根本不需要 Provides
类,因为您只根据其他两个类的方法给出它的实现!
您可以将 provides
和 #>
拉出为具有适当 Instance
和 Implements
的顶级函数> 约束,你不会失去任何东西,并且避免了对不可判定实例的需要。
但是,您确实需要/想要 MPTC,这很好......
关于Haskell MultiParamTypeClasses 和 UndecidableInstances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21216861/
考虑以下代码示例: {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} -- Is there a way
是的,我知道 UndecidableInstances可能很糟糕。我真的很努力地设计我的模块,以便它不需要它但是我有这样的东西: instance Foo x (C x y) => Bar (C x
我有一个 UndecidableInstances我无法弄清楚如何避免使用 newtype 的问题.这是我最初的: {-# LANGUAGE TypeFamilies, FlexibleContext
我写了一些需要 -XUndecidableInstances 来编译的 Haskell 代码。我确实理解为什么会发生这种情况,因为违反了某个条件,因此 GHC 大喊大叫。 但是,我从未遇到过类型检查器
我是 Haskell 新手,只是玩了一段时间。 我编写了一个轻量级的 OOP 模拟: --OOP.hs {-# LANGUAGE MultiParamTypeClasses, FlexibleIn
我想在库中做一些魔术,允许多态地解构产品类型。这是一个或多或少的工作模型,说明了我想做的事情: {-# LANGUAGE MultiParamTypeClasses, FunctionalDepend
在之前使用 UndecidableInstances 编写一些代码时,我遇到了一些我觉得很奇怪的东西。我无意中创建了一些我认为不应该进行类型检查的代码: {-# LANGUAGE FlexibleIn
假设 Haskell 库设计者决定使用 UndecidableInstances 由于某些原因。该库编译良好。现在假设某个程序使用该库(例如定义其类型类的一些实例),但不使用扩展。编译失败(不会终止)
在 GHC 8.0.1 中,我尝试为类型级列表实现类型级 Length 函数。它编译: {-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-}
正在关注 this tutorial ,我有以下代码: {-# LANGUAGE DataKinds, TypeFamilies #-} data Nat = Z | S Nat type famil
我知道the documentation for -XUndecidableInstances ,但我想我会要求详细说明。 假设我有两个多参数类型类(-XMultiParamTypeClasses 允
我一直在尝试了解免费的 monad;作为学习辅助工具,我成功地为以下 Free 类型编写了一个 Show 实例: {-# LANGUAGE FlexibleContexts, UndecidableI
我是一名优秀的程序员,十分优秀!