相关疑难解决方法(0)

应用解析比monadic解析有什么好处?

似乎已经达成共识,你应该使用Parsec作为应用而不是monad.应用解析比monadic解析有什么好处?

  • 样式
  • 性能
  • 抽象化

monadic解析了吗?

monads haskell parsec applicative

61
推荐指数
3
解决办法
1万
查看次数

简单的例子来说明Category,Monoid和Monad?

我对这三个概念感到非常困惑.

有没有简单的例子来说明Category,Monoid和Monad之间的区别?

如果有这些抽象概念的说明,将会非常有帮助.

monads haskell category-theory monoids

49
推荐指数
1
解决办法
3255
查看次数

从monad转换为applicative

好的,所以我知道Applicative类型类包含什么,以及为什么它有用.但是我不能完全围绕你如何在一个非平凡的例子中使用它.

例如,考虑以下相当简单的Parsec解析器:

integer :: Parser Integer
integer = do
  many1 space
  ds <- many1 digit
  return $ read ds
Run Code Online (Sandbox Code Playgroud)

现在,如果不使用Monad实例,你会怎么写Parser?很多人声称这可以做到并且是个好主意,但我无法弄清楚究竟是怎么回事.

monads haskell applicative

19
推荐指数
3
解决办法
776
查看次数

适用(和朋友)方法是否有人性化的名称?

我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:

  • <*> - 申请?
  • <*&*>- 左右适用?
  • <$> - fmap?
  • <|>

同样来自箭头

  • *** - 分裂?
  • &&& - 扇出?

如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.

haskell naming applicative

9
推荐指数
3
解决办法
510
查看次数

实例在Haskell中替代ZipList?

ZipList附带一个Functor和一个Applicative实例(Control.Applicative),但为什么不选择Alternative?

  • 有没有好的例子?
  • 下面提出的那个怎么样?
    • 它有缺陷吗?
    • 它没用吗?
    • 是否有其他合理的可能性(如Bool可通过两种方式幺半群),因此也不应该是实例

我搜索了"实例替代ZipList"(用引号查找代码优先)并且只找到了库,一些教程,讲义而没有实际的实例.

马特芬威克说,如果A是,则ZipList A只会是一个幺半群.看到这里.无论元素类型如何,列表都是幺半群.

AndrewC对同一问题的另一个答案讨论了Alternative实例的外观.他说

Zip有两个合理的选择[1,3,4] <|> Zip [10,20,30,40]:

  1. Zip [1,3,4] 因为它是第一个 - 与Maybe一致
  2. 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 …

haskell list typeclass applicative

9
推荐指数
1
解决办法
1041
查看次数

应用函子方面的一元序列

假设我们有一个一元序列:

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一起使用,但我不知道如何使用)。

haskell

4
推荐指数
1
解决办法
83
查看次数