2016-06-21 9 views
0

В scala, как бы я написал общую функцию для своего рода монады, если я хочу использовать pure (или что-то в этом роде)? Как эта подпись в Haskell:Scala generic Monad function?

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

Дело в том, Существует не общий pure или return, что я нашел, так что я не могу упаковать a в монаду m.

ответ

2

Scalaz имеет pointscalaz.syntax.applicative), а также имеет псевдоним pure (так что вы могли бы заменить point с pure ниже):

import scalaz._, Scalaz._ 

1.point[Option] // Option[Int] = Some(1) 
1.point[List] // List[Int] = List(1) 

Это немного сложнее монады с несколькими параметрами типа, в этом случае вам нужно использовать тип лямбда или псевдоним типа.

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 компилятора:

1.point[String \/ ?] 
1.point[Reader[Int, ?]] 

 Смежные вопросы

  • Нет связанных вопросов^_^