似乎已经达成共识,你应该使用Parsec作为应用而不是monad.应用解析比monadic解析有什么好处?
monadic解析了吗?
我对这三个概念感到非常困惑.
有没有简单的例子来说明Category,Monoid和Monad之间的区别?
如果有这些抽象概念的说明,将会非常有帮助.
好的,所以我知道Applicative类型类包含什么,以及为什么它有用.但是我不能完全围绕你如何在一个非平凡的例子中使用它.
例如,考虑以下相当简单的Parsec解析器:
integer :: Parser Integer
integer = do
many1 space
ds <- many1 digit
return $ read ds
Run Code Online (Sandbox Code Playgroud)
现在,如果不使用Monad实例,你会怎么写Parser?很多人声称这可以做到并且是个好主意,但我无法弄清楚究竟是怎么回事.
我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing为<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:
<*> - 申请?<*&*>- 左右适用?<$> - fmap?<|>同样来自箭头
*** - 分裂?&&& - 扇出?如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.
ZipList附带一个Functor和一个Applicative实例(Control.Applicative),但为什么不选择Alternative?
Bool可通过两种方式幺半群),因此也不应该是的实例我搜索了"实例替代ZipList"(用引号查找代码优先)并且只找到了库,一些教程,讲义而没有实际的实例.
马特芬威克说,如果A是,则ZipList A只会是一个幺半群.看到这里.无论元素类型如何,列表都是幺半群.
AndrewC对同一问题的另一个答案讨论了Alternative实例的外观.他说
Zip有两个合理的选择
[1,3,4] <|> Zip [10,20,30,40]:
Zip [1,3,4]因为它是第一个 - 与Maybe一致Zip [10,20,30,40]因为它是最长的 - 与Zip []丢弃一致
Zip基本上是ZipList.我认为答案应该是Zip [1,3,4,40].我们来看一个实例:
instance Aternative Zip where
empty = Zip []
Zip xs <|> Zip ys = Zip (go xs ys) where
go [] ys = ys
go (x:xs) ys = x : go xs (drop 1 ys)
Run Code Online (Sandbox Code Playgroud)
唯一Zip …
假设我们有一个一元序列:
doSomething = do
a <- f
b <- g
c <- h
pure (a, b, c)
Run Code Online (Sandbox Code Playgroud)
我们可以使用 applicative functor 轻松地重写它:
doSomething2 = (,,) <$> f <*> g <*> h
Run Code Online (Sandbox Code Playgroud)
但是如果 monadic 序列看起来像这样:
doSomething' n = do
a <- f n
b <- g a
c <- h b
pure (a, b, c)
Run Code Online (Sandbox Code Playgroud)
还有可能在那里使用 applicative 吗?如果不是,障碍是什么?(还有一本书写的,尽管如此,我们可以使用 applicative 和join一起使用,但我不知道如何使用)。