相关疑难解决方法(0)

具体示例显示monad在组合下没有关闭(带证据)?

众所周知,应用函子在组合下是封闭的,但是monad不是.但是,我一直难以找到一个具体的反例,表明monad并不总是构成.

这个答案给出[String -> a]了一个非monad的例子.在玩了一下之后,我直觉地相信它,但是这个答案只是说"加入无法实现"而没有给出任何理由.我想要更正式的东西.当然有很多类型的函数[String -> [String -> a]] -> [String -> a]; 必须表明任何这样的功能必然不符合monad法则.

任何例子(附带证据)都可以; 我不一定特别想要证明上述例子.

monads haskell proof composition

79
推荐指数
3
解决办法
4668
查看次数

Monads作为附属物

我一直在读类别理论中的单子.monads的一个定义使用一对伴随函子.monad是使用这些仿函数的往返定义的.显然,在类别理论中,附加是非常重要的,但我没有看到关于伴随函子的Haskell monad的任何解释.有没有人给它一个想法?

monads haskell functor category-theory

76
推荐指数
3
解决办法
4895
查看次数

什么monad可以表示为free over some functor?

对文件Free说:

许多常见的单子出现为免费单子,

  • 鉴于data Empty a,Free EmptyIdentitymonad 同构.
  • Free Maybe可用于建模偏好monad,其中每个图层表示运行计算的时间更长.

还有哪些monad可以使用Free

我只想到一个:我相信Free (Const e)是同构的Either e.

编辑:哪些monad 不能用于表达Free?为什么?

monads haskell functor free-monad

26
推荐指数
3
解决办法
1615
查看次数

应用变压器真的是多余的吗?

有很多关于Applicative 不需要自己的变压器类的讨论,如下所示:

class AppTrans t where
    liftA :: Applicative f => f a -> t f a
Run Code Online (Sandbox Code Playgroud)

但我可以定义似乎不是应用程序组合的应用变换器!例如,有效的:

data MStream f a = MStream (f (a, MStream f a))
Run Code Online (Sandbox Code Playgroud)

提升只是在每一步都执行副作用:

instance AppTrans MStream where
    liftA action = MStream $ (,) <$> action <*> pure (liftA action)
Run Code Online (Sandbox Code Playgroud)

如果f是一个应用程序,那么MStream f也是如此:

instance Functor f => Functor (MStream f) where
    fmap fun (MStream stream) = MStream $ (\(a, as) -> (fun a, fmap fun as)) <$> …
Run Code Online (Sandbox Code Playgroud)

haskell stream typeclass

22
推荐指数
1
解决办法
529
查看次数

仿函数的这个属性比单子强吗?

在思考如何推广monad时,我想出了一个仿函数F的以下属性:

inject :: (a -> F b) -> F(a -> b) 
Run Code Online (Sandbox Code Playgroud)

- 这应该是a和b中的自然变换.

如果没有更好的名称,如果存在上面显示的自然变换,我将函数F称为可绑定inject.

主要问题是,这个属性是否已经知道并且有一个名称,它是如何与仿函数的其他众所周知的属性相关的(例如,应用,monadic,尖头,可遍历等)

名称"可绑定"的动机来自以下考虑:假设M是monad而F是"可绑定"仿函数.然后有一个具有以下自然态射:

fbind :: M a -> (a -> F(M b)) -> F(M b)
Run Code Online (Sandbox Code Playgroud)

这类似于monadic"bind",

bind :: M a -> (a -> M b) -> M b
Run Code Online (Sandbox Code Playgroud)

除了结果用仿函数F装饰.

背后的想法fbind是,广义的monadic操作不仅可以产生单个结果M b,而且可以产生这种结果的"函数"F.我想表达一个monadic操作产生几个"计算线"而不仅仅是一个的情况; 每个"计算链"再次成为一元计算.

注意,每个仿函数F都具有态射

eject :: F(a -> b) -> a -> F b
Run Code Online (Sandbox Code Playgroud)

这与"注入"相反.但并非每个仿函数F都有"注入".

具有"注入"的仿函数的示例:F t = (t,t,t) 或者F t = c -> (t,t)其中c是常量类型.F t = cFunctor(常量仿函数)或 …

monads haskell functional-programming functor category-theory

19
推荐指数
2
解决办法
675
查看次数

没有monad变换器的monad的明确示例是什么?

Monad变换器以所有标准monad(Reader,Writer,State,Cont,List等)而闻名,但这些monad变换器中的每一个都以稍微不同的方式工作.在给定具有monad实例的类型构造函数的定义的情况下,没有用于构造monad变换器的通用方法或公式.因此,不能保证根据某些任意业务要求设计的monad数据类型将具有monad变换器.有没有这样一个明确的例子?

相关工作

另一个问题解释了两个monad的仿函数组合不一定是monad.另见这个问题.这些例子没有回答当前的问题 - 它们仅仅说明了没有构造单子变压器的一般方法的问题.这些例子表明,给定两个单子M和N,我们有时会发现M(N a)是单子,有时N(M a)是单子,有时也不是单子.但这既没有说明如何为M或N构造monad变换器,也没有表明它是否存在.

另一个问题的答案认为,IO单子不能有一个单子转换,因为如果它有一个IOT,我们可以申请IOTList,然后抬起空列表(lift [])到生成的单子就必须撤消副作用的进行"早期" IO monad.这个论点是基于IOmonad"实际上执行"可能无法撤消的副作用的想法.但是,IOmonad不是显式类型构造函数.

讨论

在明确给出monad类型的每个例子中,可以以某种方式找到monad变换器, - 有时需要一定的独创性.例如,最近发现ListT存在于Haskell库中的变换器以微妙的方式发生错误,但最终通过更改定义来解决问题.ListT

没有变换器的monad的标准示例是monad,例如IO,实际上不是由显式类型构造函数定义的 - IO是库以某种方式在低级别定义的不透明"魔术"类型.很明显,无法IO纯函数赋予monad实例定义为显式类型构造函数.该IO示例显示,如果我们允许monad实例包含具有不纯副作用的隐藏低级代码,则monad转换器可能无法存在.所以,让我们将注意力限制在使用纯函数实现的monad上.

似乎没有一种算法可以从monad的源代码中自动导出monad变换器.我们甚至知道这总是可能的吗?

为了让我更清楚一个monad的"明确例子"我的意思:假设我声称

 type Q u v a = ((u -> (a, Maybe a)) -> v) -> u -> (a, Maybe a)
Run Code Online (Sandbox Code Playgroud)

可以有一个合法的Monad实例相对于所述类型参数 …

monads haskell functional-programming monad-transformers

16
推荐指数
1
解决办法
390
查看次数

通常说来,monad变压器是否由附加条件产生?

在“ 伴随函子”中确定monad变压器,但升降机在哪里?,西蒙C向我们展示了该结构...

newtype Three u f m a = Three { getThree :: u (m (f a)) }
Run Code Online (Sandbox Code Playgroud)

...,作为那里讨论的答案,可以给instance Adjunction f u => MonadTrans (Three u f)附加语将其提供为AdjointT)。因此,任何Hask / Hask附加都将导致monad变压器。尤其StateT s是通过(,) s和之间的临时连接以这种方式产生(->) s

我的后续问题是:此构造是否可以推广到其他monad变压器?是否有办法从合适的附件中从变压器包中衍生出其他变压器?


Meta备注:我的回答最初是为Simon C的问题写的。我选择将其分解为一个自我回答的问题,因为在重读该问题时,我注意到我所谓的回答与该评论中的讨论有关,而与问题本身无关。这个问答可能还会跟进另外两个密切相关的问题:是否有一个单声道没有相应的单声道转换器(IO除外)?并且具有可遍历的任意单子的组合是否总是单子?

monads haskell monad-transformers category-theory

16
推荐指数
1
解决办法
262
查看次数

如果两个monad变换器属于不同类型,但它们的底层monad是同一类型,是否有一种原则性的方法来组成它们?

我无法解决这个问题.但是这里有一个用例:假设你有两个monad变换器,t并且s在同一个monad上进行转换m:

master :: (MonadTrans t, Monad m) => t m a b
slave  :: (MonadTrans t, Monad m) => s m a b
Run Code Online (Sandbox Code Playgroud)

而且我想要构建master并且slavem原语被提升到t和时它们可以相互通信s.签名可能是:

bound :: (MonadTrans t, MonadTrans s, Monad m, Monoid a) => t m a b -> s m a b -> (...)
But what is the type of (...) ?
Run Code Online (Sandbox Code Playgroud)

一个用例,用含糖表示法:

master :: Monoid a => a -> t m …
Run Code Online (Sandbox Code Playgroud)

monads haskell monad-transformers

7
推荐指数
1
解决办法
163
查看次数

伴随仿函数确定monad变压器,但哪里升力?

我对这里描述的用于确定伴随仿函数的monad变换器的结构很感兴趣.这里有一些代码总结了基本思想:

{-# LANGUAGE MultiParamTypeClasses #-}

import           Control.Monad

newtype Three g f m a = Three { getThree :: g (m (f a)) }

class (Functor f, Functor g) => Adjoint f g where
  counit :: f (g a) -> a
  unit   :: a -> g (f a)

instance (Adjoint f g, Monad m) => Monad (Three g f m) where
  return  = Three . fmap return . unit
  m >>= f = Three $ fmap (>>= counit . …
Run Code Online (Sandbox Code Playgroud)

monads haskell state-monad monad-transformers

7
推荐指数
1
解决办法
410
查看次数