相关疑难解决方法(0)

为什么Applicative应该是Monad的超类?

鉴于:

Applicative m, Monad m => mf :: m (a -> b), ma :: m a
Run Code Online (Sandbox Code Playgroud)

它似乎被认为是一项法律:

mf <*> ma === do { f <- mf; a <- ma; return (f a) }
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

(<*>) === ap
Run Code Online (Sandbox Code Playgroud)

说的文档Control.Applicative<*>是"顺序应用程序",这表明了这一点(<*>) = ap.这意味着<*>必须从左到右依次评估效果,以保持一致>>=...但这感觉不对.McBride和Paterson的原始论文似乎暗示从左到右的排序是任意的:

IO monad,实际上任何Monad,都可以通过取pure= return<*>=来实现ap.我们也可以使用它的变量ap以相反的顺序执行计算,但我们将在本文中保持从左到右的顺序.

因此,有两个合法的,非平凡的推导<*>来源于>>=并且return具有不同的行为.在某些情况下,既没有这两个推导是可取的.

例如,(<*>) === …

monads haskell applicative fam-proposal

43
推荐指数
3
解决办法
2605
查看次数

“These”的“Applicative”实例能否保留更多“失败”信息?

我正在查看这些These包中的数据类型,特别是在其实例中:Applicative

instance (Semigroup a) => Applicative (These a) where
    pure = That
    This  a   <*> _         = This a
    That    _ <*> This  b   = This b
    That    f <*> That    x = That (f x)
    That    f <*> These b x = These b (f x)
    These a _ <*> This  b   = This (a <> b)
    These a f <*> That    x = These a (f x)
    These a f <*> These b x …
Run Code Online (Sandbox Code Playgroud)

haskell applicative

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

为什么验证会违反monad法律?

SO上给出了一个解释,为什么像scalaz,猫(Scala)或Arrow(Kotlin)这样的验证不能成为monad.

据我所知,这是因为他们已经根据应用函子和所需的验证行为对monad进行建模,因为应用程序(收集所有残留物)与作为monad的验证的所需行为不同(序列验证并快速失败)第一个无效).因此,当您希望快速发生故障时,您需要将验证转换为其中一个(这是一个monad).

https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ上,他们提到验证不是monad的原因,是因为以下属性不会成立:

x <|*|> y === x >>= (a => y map ((a, _))) 
Run Code Online (Sandbox Code Playgroud)

但是看一个monad的定义,上面的属性不是monad法则的一部分.那么,这是因为monad是以应用程序的形式实现的,还是上述属性是monad的先决条件?

这种更高级的推理对我来说都是新的,但是由于我对FP的理解有限,我可以使用一种验证数据类型,当用作应用程序(累积invalids)时有一种行为,当用作mo​​nad时有另一种行为(快速失败).

monads scalaz applicative scala-cats arrow-kt

5
推荐指数
1
解决办法
183
查看次数