2015-06-28 26 views
6

Monadik kavrayışları kullanarak aşağıdaki f, g ve h işlevlerini göz önünde bulundurun. f, g ve h tüm imzaya sahipScala'nın monadik zincirleme deneyini deneyin

for { 
    x <- List (11, 22, 33, 44, 55) 
    y <- f (x) 
    z <- g (y) 
    a <- h (z) 
    } yield a 

ise:

Int => Option [ Int ] 

sonra amaçlı anlama ince derler. Ben Try [ Int ] tarafından Option [ Int ] yerine Ancak eğer Scala'nın tip inferencer hattı aşağıdaki hata iletisiyle

y <- f (x) 

şikayetçi.

error: type mismatch; 
    found : scala.util.Try[Int] 
    required: scala.collection.GenTraversableOnce[?] 
     y <- f (x) 

Neden? Hem Option [ _ ] ve Try [ _ ], monadlardır (ya da olmalıdır) ve kabataslak olarak düzgün çalışmalıdır.

+1

Burada daha kısa bir demo 'için {x <- Liste (1,2,3); y <- Bazı (x)} verim y' iyidir, oysa {x <- Liste (1,2,3); y <- deneyin {x}} verim y 'yukarıda belirtilen bir hata üretir. – Val

cevap

9

Sadece aynı türdeki monadları kavramak için kullanabilirsiniz. Bu durumda, birincisi, tüm değerlerinizin GenTraversableOnce olması gerekir. Option'dan Seq'a dolaylı bir dönüşüm olduğu için Option ile çalışır, ancak bu Try için mümkün değildir.

+0

Teşekkürler. Hesaplamalarımı monadik stili zincirlemek istedim, ancak hata iletilerini de yaymak istedim, önerilen Scala yöntemi nedir? –

+1

Monad transformatörlerine bir göz atmalısınız. Bunun için scalaz kullanmanızı tavsiye ederim. – drexin

+1

Zincirleme monadları gibi kavramsal olarak basit bir şeyin 'ağır ekipman' gerektirmesi şaşırtıcıdır. –