- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力掌握GADTs
,我查看了GADTs example在 GHC 的手册中。据我所知,MultiParamTypeClasses
可以做同样的事情。 :
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
FlexibleInstances, UndecidableInstances #-}
class IsTerm a b | a -> b where
eval :: a -> b
data IntTerm = Lit Int
| Succ IntTerm
data BoolTerm = IsZero IntTerm
data If p a = If p a a
data Pair a b = Pair a b
instance IsTerm IntTerm Int where
eval (Lit i) = i
eval (Succ t) = 1 + eval t
instance IsTerm BoolTerm Bool where
eval (IsZero t) = eval t == 0
instance (IsTerm p Bool, IsTerm a r) => IsTerm (If p a) r where
eval (If b e1 e2) = if eval b then eval e1 else eval e2
instance (IsTerm a c, IsTerm b d) => IsTerm (Pair a b) (c, d) where
eval (Pair e1 e2) = (eval e1, eval e2)
eval
,我们有完全相同的构造函数和完全相同的代码。 (跨实例定义传播)如 GHC 的
GADTs
例子。
GADTs
到底是怎么回事? ?
GADTs
有什么我可以做的吗?我不能用
MultiParamTypeClasses
?还是他们只是提供了一种更简洁的做事方式,而我可以用
MultiParamTypeClasses
来做这些事情?反而?
最佳答案
您可以方便地将相同类型但具有不同构造函数的 GADT 值放入容器中,
map eval [Lit 1, If (IsZero (Lit 3)) (Lit 4) (Succ (Lit 6))]
Lit
和
If
是不同类型的构造函数,因此需要一个包装类型来将它们放入同一个容器中。据我所知,包装器类型必须是存在类型 à la
data Wrap t = forall a. (IsTerm a t) => Wrapper a
instance IsTerm (Wrap t) t where
eval (Wrapper e) = eval e
map
的能力函数如
eval
在列表之上。所以你已经中途或更多地回到了 GADT,减去了便利。
关于haskell - GADT 与 MultiParamTypeClasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10994508/
我有一个定义如下的类型类: class (Eq a, Show a, Typeable a) => Condition v a where (和一些方法) 我想编写一个函数,它接受两个具有相同“v”的
假设我定义了 multi-parameter type class : {-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes, Flexibl
我正在使用一个类型类,我可以在其中“测量”类型 v 的某些属性。在 a 类型的对象上.例如,请考虑以下定义: {-# LANGUAGE MultiParamTypeClasses #-} data S
我正在努力掌握GADTs ,我查看了GADTs example在 GHC 的手册中。据我所知,MultiParamTypeClasses 可以做同样的事情。 : {-# LANGUAGE MultiP
我是 Haskell 新手,只是玩了一段时间。 我编写了一个轻量级的 OOP 模拟: --OOP.hs {-# LANGUAGE MultiParamTypeClasses, FlexibleIn
通过函数依赖,我可以声明 Foo 类: class Foo a b c | a -> b where foo1 :: a -> b -> c foo2 :: a -> c 当我调用fo
在 Haskell 编程后,我即将开始学习 Rust。trait关键字让我感兴趣,但我注意到您只能引用一种类型( Self )。 在 Haskell 中,这种行为有一个编译指示: {-# LANGUA
当我使用 MultiParamTypeClasses 时,我可以创建忽略类型参数之一的类函数(即,如下面的“身份”)。 {-# LANGUAGE MultiParamTypeClasses #-} d
class Monad m => MonadState s m | m -> s where -- | Return the state from the internals of the m
我是一名优秀的程序员,十分优秀!