相关疑难解决方法(0)

感到困惑的是'Alternative'类型类的含义及其与其他类型类的关系

我一直在浏览Typeclassopedia来学习类型类.我不理解Alternative(MonadPlus就此而言).

我遇到的问题:

  • 'pedia说"替代类型类适用于具有幺半群结构的Applicative仿函数." 我不明白 - 不是替代意味着与Monoid完全不同的东西吗?也就是说,我理解了替代类型类在两件事之间的选择,而我理解Monoids是关于组合事物.

  • 为什么Alternative需要一个empty方法/成员?我可能错了,但似乎根本没有使用...至少在我能找到的代码中.它似乎不符合课堂主题 - 如果我有两件事,需要选择一件,我需要什么'空'?

  • 为什么Alternative类需要一个Applicative约束,为什么它需要一种* -> *?为什么不<|> :: a -> a -> a呢?所有的实例仍然可以用同样的方式实现......我想(不确定).Monoid没有提供什么价值?

  • 什么是点MonadPlus式类?我不能解开所有善良的通过只是使用的东西既是MonadAlternative?为什么不放弃呢?(我确定我错了,但我没有任何反例)

希望所有这些问题都是连贯的......!


赏金更新:@Antal的答案是一个很好的开始,但Q3仍然是开放的:替代品提供的Monoid不是什么?我发现这个答案不能令人满意,因为它缺乏具体的例子,并且特别讨论了Alternative的高知名度如何将它与Monoid区分开来.

如果要将应用效果与Monoid的行为结合起来,为什么不只是:

liftA2 mappend
Run Code Online (Sandbox Code Playgroud)

这对我来说更加令人困惑,因为许多Monoid实例与Alternative实例完全相同.

这就是为什么我要寻找具体的例子,说明为什么备选是必要的,以及它与Monoid的不同之处 - 或者意味着不同的东西.

haskell typeclass

59
推荐指数
4
解决办法
7000
查看次数

为什么MonadPlus而不是Monad + Monoid?

我正在努力了解这背后的动机MonadPlus.如果已经有类型MonadMonoid?为什么有必要?

当然,实例Monoid是具体类型,而实例Monad需要单个类型参数.(有关有用的解释,请参阅Monoid与MonadPlus.)但是你不能重写任何类型约束

(MonadPlus m) => ...
Run Code Online (Sandbox Code Playgroud)

作为MonadMonoid?的组合?

(Monad m, Monoid (m a)) => ...
Run Code Online (Sandbox Code Playgroud)

例如,guard从中获取功能Control.Monad.它的实施是:

guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
Run Code Online (Sandbox Code Playgroud)

我只能使用Monad和实现它Monoid:

guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
Run Code Online (Sandbox Code Playgroud)

有人可以澄清 …

monads haskell monoids

35
推荐指数
3
解决办法
1654
查看次数

mplus必须始终是联想的吗?Haskell wiki对阵Oleg Kiselyov

哈斯克尔维基断言

MonadPlus的实例需要满足几个规则,就像Monad的实例需要满足三个monad定律一样.......最重要的是mzero和mplus形成一个幺半群.

其结果是mplus必须是联想的.该哈斯克尔维基同意.

然而,Oleg在他的众多回溯搜索实现之一中写道

-- Generally speaking, mplus is not associative. It better not be,
-- since associative and non-commutative mplus makes the search
-- strategy incomplete.
Run Code Online (Sandbox Code Playgroud)

定义非关联是否是犹太教mplusMonadPlus如果mplus不是关联的话,前两个链接非常清楚地表明你没有真实的实例.但是,如果奥列格确实它...(在另一方面,在该文件中,他只是定义调用的函数mplus,而并没有说 mplusmplusMonadPlus,他选择了一个非常令人迷惑的名字,如果这是正确的解释.)

monads haskell

23
推荐指数
2
解决办法
2142
查看次数

使用Maybe进行错误检测和报告

我正在Haskell中编写一个命题逻辑解析器.我现在正在手工解析作为学习练习.最终我将解决Parsec.与此同时,我正试图绕着Monads.特别是,我Maybe用来报告我的parse功能错误.我目前的麻烦是辅助函数的一部分:

parse' :: String -> (Maybe Wff, String)
parse' ('[':rest) = (x, if null rest''
                        then ""
                        else tail rest'')
        where (a, rest') = parse' rest
              (b, rest'') = parse' (if null rest'
                                    then ""
                                    else tail rest')
              x = if null rest'
                     || null rest''
                     || head rest' /= '|'
                     || head rest'' /= ']'
                  then Nothing
                  else Or <$> a <*> b
Run Code Online (Sandbox Code Playgroud)

(作为参考,parse可在此处找到完整功能.)

此代码解析形式的命题[ A | B ],其中 …

parsing haskell text-parsing

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

标签 统计

haskell ×4

monads ×2

monoids ×1

parsing ×1

text-parsing ×1

typeclass ×1