liftM

2012-10-12 34 views
10

साथ Scalaz 7 के EitherT का उपयोग कैसे करें, तो मैं दो प्रकार तर्क लेने एक इकाई ट्रांसफार्मर प्रकार है, मैं liftM का उपयोग बदल इकाई में मान लिफ्ट करने के लिए कर सकते हैं:liftM

scala> val o = 1.point[List].liftM[OptionT] 
o: scalaz.OptionT[List,Int] = OptionT(List(Some(1))) 

लेकिन अगर मैं के साथ एक ही बात की कोशिश EitherT ऐसा लगता है जैसे मैं एक प्रकार अन्य नाम (या एक प्रकार लैम्ब्डा) का उपयोग करना चाहिए:

scala> val e = 1.point[List].liftM[({type l[a[+_],b] = EitherT[a, String, b]})#l] 
e: scalaz.EitherT[List,java.lang.String,Int] = [email protected] 

यह करने के लिए उचित तरीका क्या है? आदर्श रूप से अभिव्यक्ति के अपेक्षित प्रकार (val blah: EitherT[List, String, Int] = 1.point[List].liftM जैसे कुछ) का उपयोग करके liftM के लिए तर्क तर्क का उल्लंघन करना।

उत्तर

8

वहाँ सामान्य रूप में बहु तर्क प्रकार कंस्ट्रक्टर्स को संभालने के लिए एक बेहतर तरीका होना करने के लिए प्रकट नहीं होता है, लेकिन EitherT के विशिष्ट मामले में, हम उपयोग कर सकते हैं EitherT.right:

scala> val o: EitherT[List, String, Int] = EitherT.right(1.point[List]) 
o: scalaz.EitherT[List,String,Int] = [email protected]