相关疑难解决方法(0)

什么时候应该使用 Kleisli?

我最近偶然发现了 Kleisli 的概念,我阅读的每个教程/链接/参考都通过以下结构激发了 Kleisli 的使用:

  1. 组合返回 monad 的函数f: a -> m[b]with g: b -> m[c]- 我认为monad 的定义已经捕捉到了这种情况 -do/bind/for/flatMap这样做。人们不必依靠 Kleisli 构造来实现这一目标。所以这不可能是 Kleisli IMO 的“主要”用例。
  2. 插入配置:该配置指出,如果多个对象(类型、案例/数据类等)需要Config 注入,则可以使用 Kleisli 构造来抽象出可重复注入。有很多方法可以实现这一点(例如implicit在 Scala 中使用s),可能不需要调用 Kleisli。同样,IMO 这并没有作为“主要”用例脱颖而出。
  3. Monad Transformers:我对此没有深入的理解,但这是我的解释:如果您需要“组合 monad”,您需要一个允许您参数化 monad 本身的构造。例如M1[M2[M1[M2[a]]]],可以转化成[M1[M2[a]]](I可能是错误的)来跨越一元边界压扁是可组合与a -> M3[b](比方说)。为此我们可以使用 Kleisli 三元组并调用该构造,因为如果您要从头开始,您可能会重新发明Kleisli。似乎是证明使用 Kleisli 合理的一个很好的候选者。这样对吗? …

monads haskell functional-programming scala

35
推荐指数
2
解决办法
1722
查看次数

撰写Monads v.Applicative Functors

Typeclassopedia单子变形金刚节介绍:

不幸的是,monad并不像applicative functor那样组合(如果你不需要Monad提供的全部功能,那么使用Applicative的另一个原因)

纵观类型的>>=<*>,上面的语句,我不清楚.

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

请解释一下"monad不像compative functors那样好."

我看了这个答案,但你能举个例子来帮我理解吗?

haskell

29
推荐指数
1
解决办法
1938
查看次数

通常说来,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
查看次数

是`数据PoE a =空| 对aa`一个monad?

这个问题来自于一个应用而非Monad的仿函数的例子中的答案 :它声称是

data PoE a = Empty | Pair a a deriving (Functor,Eq)
Run Code Online (Sandbox Code Playgroud)

不能有monad实例,但我没有看到:

instance Applicative PoE where
    pure x = Pair x x
    Pair f g <*> Pair x y = Pair (f x) (g y)
    _        <*> _        = Empty
instance Monad PoE where
    Empty    >>= _ = Empty
    Pair x y >>= f = case (f x, f y) of 
                       (Pair x' _,Pair _ y') -> Pair x' y'
                       _ -> Empty
Run Code Online (Sandbox Code Playgroud)

实际的原因,我相信这是一个单子是,它是同构于Maybe (Pair …

monads haskell functional-programming

14
推荐指数
4
解决办法
572
查看次数

是否存在Powerset-over-Reader monad?

用于环境共享和非确定性的规范"Monad实例"如下(使用伪Haskell,因为Haskell Data.Set当然不是monadic):

eta :: a -> r -> {a} -- '{a}' means the type of a set of a's
eta x = \r -> {x}

bind :: (r -> {a}) -> (a -> r -> {b}) -> r -> {b}
m `bind` f = \r -> {v | x ? m r, v ? f x r}
Run Code Online (Sandbox Code Playgroud)

通常,当尝试将像Powerset(List,Writer等)的"容器"monad与第二个monad m(这里,粗略地,Reader)组合时,一个'包裹' m在容器monad周围,如上所述.

那么,我想知道以下潜在的Powerset-over-Reader规范:

eta' :: a -> {r -> a}
eta' x = {\r -> x}

bind' :: {r …
Run Code Online (Sandbox Code Playgroud)

monads haskell reader-monad

8
推荐指数
1
解决办法
273
查看次数