/ / Opätovné chovanie Haskellovho "replikátu" v Scale - scala, monádiách, znakoch

Znovuzískanie správania Haskellovho "replikátu" v Scale - scala, monádiách, znakoch

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ď č. 1

Myslí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))