Snažím sa naučiť, ako robiť monadický kód v Scale, ale chýba mi Haskellova schopnosť obmedzovať typy, aby patrili do typových tried, ktoré deklarujú typ funkcie.
Napríklad sa snažím napísať niečo podobné replicateM
z Control.Monad
v Scale. Bez obáv o anotácie typu by to bolo niečo ako:
def replicateM(n: Int)(x: M[A]): M[List[A]] = n match {
case 0 => map(x => List())
case _ => for {
head <- x
tail <- replicateM(n-1)(x)
} yield head: tail
}
(Vidím, že to nemusí byť účinnejšia implementácia, je to jednoduchý spôsob, ako to napísať).
Tam, kde narazím, je: ako správne poznám poznámky o typoch? Aký typ je M? Ako môžem obmedziť len M na typy, ktoré majú flatMap
definované na nich? Mám pocit, že by som to mohol robiť s vlastnosťami, ale nie som si istý, ako.
odpovede:
6 pre odpoveď č. 1Myslím, že ak hľadáte Haskella v Scale, určite sa treba pozrieť scalaz, Už má replicateM, Monads, Monoids, Monad Transformers a oveľa viac
import scalaz._
import Scalaz._
println(Option(1).replicateM(10))
výsledok
Some(List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))