- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This question处理构建一个适当的Monad
来自单子(monad)的实例,但仅在某些约束下 - 例如Set
.诀窍是将其包装成 ContT
,它将约束推迟到包装/展开其值。
现在我想对 Applicative
做同样的事情s。特别是,我有一个 Applicative
pure 具有类型类约束的实例。有没有类似的技巧来构造一个有效的 Applicative
实例?
(是否有像 there is for monads 一样的“所有应用仿函数之母”?)
最佳答案
从 Category
开始可能是最一致的可用方式。 ,对对象有限制是很自然的:对象!
class Category k where
type Object k :: * -> Constraint
id :: Object k a => k a a
(.) :: (Object k a, Object k b, Object k c)
=> k b c -> k a b -> k a c
class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
fmap :: (Object r a, Object t (f a), Object r b, Object t (f b))
=> r a b -> t (f a) (f b)
Applicative
不幸的是,做起来不那么简单。
Mathematically, these are monoidal functors , 所以
we first need单曲面类别。
categories
has that class ,但它不适用于基于约束的版本,因为我们的对象总是任何类型的
*
有一个约束。所以我做的是编一个
Curry
class , 哪种近似。
Monoidal
functors :
class (Functor f r t, Curry r, Curry t) => Monoidal f r t where
pure :: (Object r a, Object t (f a)) => a `t` f a
fzipWith :: (PairObject r a b, Object r c, PairObject t (f a) (f b), Object t (f c))
=> r (a, b) c -> t (f a, f b) (f c)
Applicative
当我们有适当的封闭笛卡尔类别时。在受限类别版本中,不幸的是,签名看起来非常糟糕:
(<*>) :: ( Applicative f r t
, MorphObject r a b, Object r (r a b)
, MorphObject t (f a) (f b), Object t (t (f a) (f b)), Object t (f (r a b))
, PairObject r (r a b) a, PairObject t (f (r a b)) (f a)
, Object r a, Object r b, Object t (f a), Object t (f b))
=> f (r a b) `t` t (f a) (f b)
Applicative
相当于
Monoidal
,并且可以按照
the Set
example 中的演示使用.
关于haskell - 如何构造带约束的 Applicative 实例(类似于使用 ContT 构造 Monad 实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099466/
我正在做一个需要我编写一个小型解释器的项目。这些指令具有简单的树形结构,其中一个命令具有暂停执行的效果。所以在下面的例子中,“baz”永远不会被打印出来。 import Control.Monad.C
我有一个简单的列表,我想在每个元素之间迭代“yield”并将该元素打印到输出。我正在尝试使用 ContT monad 来执行此操作,但遇到了问题。这是我到目前为止所拥有的: data K a = Ni
ContT 的绑定(bind)策略忽略内部 monad,实际上代码与 Cont 相同。 按照其他 Monad Transformers 的类比,我会这样实现它: return x = ContT ($
继续寻求理解 ContT 和 friend 的意义。请考虑下面的( absurd 但说明性的)代码: v :: IO (Either String [String]) v = return $ Lef
序言 我试图围绕如何实际使用 ContT 和 callCC 来做一些有用的事情。我在跟踪代码周围的信息和控制流时遇到了麻烦。 (但是,这不是延续的意义吗?) 有很多不同的方法可以使用这个 monad
我不知道如何实现它,我假设可能没有办法做到这一点。是否有证据或令人信服的论据表明它无法完成? 是什么让 ContT特别的? 最佳答案 一般来说,您唯一可以摆脱 ContT r m是类型 m r 的值.
我有一个包含 ErrorT 的 monad 变压器堆栈,我想在整个事情周围包装一个 ContT r 变压器。当我尝试这样做时,我对 throwError 的调用会生成类型错误 - 显然 ContT r
我开始阅读The Mother of All Monads ,并输入这个例子: import Control.Monad.Cont ex1 = do a :l ContMonad.hs [1 o
如何创建一个使用 State、Cont 和 Reader 转换器的 monad?我想阅读一个环境,并更新/使用状态。但是,我也想暂停/中断操作。例如,如果满足某个条件,则状态保持不变。 到目前为止,我
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在寻找一种用于异步操作的数据类型。 我发现 scalaz.ContT[Trampoline, Unit, ?]支持 scalaz.concurrent.Future 中的所有功能,此外还有 Bin
我是一名优秀的程序员,十分优秀!