2016-06-21 63 views
0

在scala中,如果我想使用pure(或類似的東西),我該如何編寫一種monad的通用函數?像這樣的簽名在Haskell:Scala通用Monad函數?

f :: Monad m => a -> m b 

的事情是,沒有一個通用的purereturn,我發現,所以我真的不能收拾a到單子m

回答

2

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, ?]]