谁首先说了以下几点?
monad只是endofunctors类别中的幺半群,问题是什么?
在一个不太重要的注意事项上,这是真的,如果是这样,你能给出一个解释(希望有一个可以被没有Haskell经验的人理解的那个)吗?
标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义:
mzero,empty或mempty.a -> a -> a,在类型类联接值加在一起:mplus,<|>或mappend.所有这三个都规定了应遵守的法律:
mempty `mappend` x = x
x `mappend` mempty = x
Run Code Online (Sandbox Code Playgroud)
因此,似乎三个类型都提供相同的方法.
(Alternative也提供some和many,但它们的默认定义通常是足够的,所以它们在这个问题上并不太重要.)
所以,我的疑问是:为什么这三个极为相似的类?除了不同的超类限制之外,它们之间是否有任何真正的区别?
haskell functional-programming typeclass applicative monoids
我已经从Monoid Morphisms,Products和Coproducts中阅读了有关Monoid同态的知识,并且无法理解100%。
作者说(强调原文):
该
length函数从映射到String,Int同时保留类半体结构。这种以一种保存方式从一个单半体映射到另一个单半体的函数称为单半体同态。通常,对于monoidM和N,是同态f: M => N,以及所有值x:M,y:M以下等式成立:Run Code Online (Sandbox Code Playgroud)f(x |+| y) == (f(x) |+| f(y)) f(mzero[M]) == mzero[N]
他的意思是说,由于数据类型String和Int是monoid ,并且函数length映射String => Int保留了monoid结构(Int是monoid),所以称为monoid同态,对吗?
haskell functional-programming scala category-theory monoids
我对这三个概念感到非常困惑.
有没有简单的例子来说明Category,Monoid和Monad之间的区别?
如果有这些抽象概念的说明,将会非常有帮助.
我正在努力了解这背后的动机MonadPlus.如果已经有类型Monad和Monoid?为什么有必要?
当然,实例Monoid是具体类型,而实例Monad需要单个类型参数.(有关有用的解释,请参阅Monoid与MonadPlus.)但是你不能重写任何类型约束
(MonadPlus m) => ...
Run Code Online (Sandbox Code Playgroud)
作为Monad和Monoid?的组合?
(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)
有人可以澄清 …
众所周知,幺半群在编程中无处不在.它们无处不在,非常有用,作为一个"爱好项目",我正在开发一个完全基于其属性的系统(分布式数据聚合).为了使系统有用,我需要有用的monoids :)
我已经知道了这些:
现在,让我们将操作的准属性定义为保持等价关系的属性.例如,如果我们考虑相等长度或相同内容直到排列的列表是等效的,则列表串联是准可交换的.
这里有一些准幺半群和准交换幺半群和半群:
其他哪些确实存在?
language-agnostic math computer-science monoids abstract-algebra
我最近试图找到一个关于monad和monoids之间差异的好消息来源.
有人可以提供关于这方面的良好资源的链接,或者花一点时间来详细说明相似之处/差异吗?
我只是偶然发现了由Edward Kmett命名为" Monoids " 的幻灯片中的monoidal 解析这个术语.幻灯片始终使用haskell.
现在,在搜索这个词的时候,我发现只有极少数提及它,而且来自同一作者.所以我认为这个术语可以在这里解释.
那么,monoidal解析一些有趣和新的东西吗?它出现在除我链接到的幻灯片之外的任何地方吗?最重要的是它是什么?幻灯片本身似乎没有给出定义,也没有强调它.
我对这两者都很陌生Monads,Monoids而且最近也学到了MonadPlus.从我所看到的,Monoid并MonadPlus都提供了二元结合运算和身份类型.(我用数学的说法称之为半群.)那么Monoid和之间的区别是MonadPlus什么?
我正在读" 了解你一个哈斯克尔",我已经涵盖了应用程序,现在我正在使用幺半群.我对这两者都没有问题,虽然我发现在实践中有用,而monoid却不是这样.所以我想我对Haskell一无所知.
首先,Applicative它说,它创建了类似于统一语法的东西来对'容器'执行各种操作.所以我们可以使用普通函数对Maybe列表执行操作IO(我应该说monad吗?我还不知道monad),函数:
?> :m + Control.Applicative
?> (+) <$> (Just 10) <*> (Just 13)
Just 23
?> (+) <$> [1..5] <*> [1..5]
[2,3,4,5,6,3,4,5,6,7,4,5,6,7,8,5,6,7,8,9,6,7,8,9,10]
?> (++) <$> getLine <*> getLine
one line
and another one
"one line and another one"
?> (+) <$> (* 7) <*> (+ 7) $ 10
87
Run Code Online (Sandbox Code Playgroud)
因此,applicative是一种抽象.我想我们可以没有它,但它有助于清楚地表达一些想法模式,这很好.
现在,让我们来看看Monoid.它也是抽象而且非常简单.但它对我们有帮助吗?对于书中的每个例子,似乎很明显有更明确的方法来做事:
?> :m + Data.Monoid
?> mempty :: [a]
[]
?> [1..3] `mappend` [4..6]
[1,2,3,4,5,6]
?> [1..3] ++ [4..6] …Run Code Online (Sandbox Code Playgroud)