![](/img/trans.png)
[英]Difference between applicative and monadic computation in scala
[英]what is difference between monadic collection, monadic type and monadic operation?
我一直在嘗試了解scala中monad的概念。 與monad相關的術語有很多。 單子類型類,單子類型,單子操作,單子集合等。所以我有諸如單子集合可以支持非單子操作的問題嗎? 是否有可能使與Scala中的monad相關的不同術語神秘化?
單子收集可以支持非單子操作嗎
一個monadic集合必須定義兩個方法: pure
和bind
。 最重要的是,它必須遵守Monad的身份(左右)和結社法則。
這樣的集合是Scala中的List[A]
,它通過apply方法具有pure
函數:
val l: List[Int] = List(1,2,3)
和flatMap
( bind
):
val flat = l.flatMap(i => List(i))
val f: Int => List[Int] = x => List(x + 1)
val x = 1
val left = List(x).flatMap(f)
val right = f(x)
left == right
val y = List(1)
val left = y.flatMap(List(_))
val right = y
left == right
val f: Int => List[Int] = x => List(x + 1)
val g: Int => List[Int] = x => List(x + 2)
val list = List(1,2,3)
val left = list.flatMap(f).flatMap(g)
val right = list.flatMap(x => f(x).flatMap(g))
left == right
如您所見, List[A]
還支持不屬於Monad定義的其他操作,例如map
(由List[A]
是monad的事實免費提供,每個monad也是函子) , filter
, foldLeft
等。
要回答您的問題:是的,具有monadic屬性的集合不僅可以支持monad定義的操作,還可以支持更多的操作。
更具體地說,我們可以說List[A]
是實現 Monad[List]
類型類的monadic集合,並且因此是具有monadic操作的 monadic類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.