0
在scala中,如果我想使用pure
(或類似的東西),我該如何編寫一種monad的通用函數?像這樣的簽名在Haskell:Scala通用Monad函數?
f :: Monad m => a -> m b
的事情是,沒有一個通用的pure
或return
,我發現,所以我真的不能收拾a
到單子m
。
在scala中,如果我想使用pure
(或類似的東西),我該如何編寫一種monad的通用函數?像這樣的簽名在Haskell:Scala通用Monad函數?
f :: Monad m => a -> m b
的事情是,沒有一個通用的pure
或return
,我發現,所以我真的不能收拾a
到單子m
。
Scalaz有point
(在scalaz.syntax.applicative
),它也有別名pure
(所以你可以point
下面pure
替換):
import scalaz._, Scalaz._
1.point[Option] // Option[Int] = Some(1)
1.point[List] // List[Int] = List(1)
,可用於與多個類型參數的單子有點難度,在這種情況下,您需要使用類型lambda或類型別名。
1.point[({ type λ[α] = String \/ α })#λ] // \/[String,Int] = \/-(1)
type ErrorOr[A] = String \/ A
1.point[ErrorOr] // ErrorOr[Int] = \/-(1)
1.point[({ type λ[α] = Reader[Int, α] })#λ]
你可以簡化使用kind projector編譯器插件類型lambda表達式:
1.point[String \/ ?]
1.point[Reader[Int, ?]]