2011-09-21 5 views
5

के साथ दृश्य सीमाओं का उपयोग करके मैं मोनॉयड विशेषता का उपयोग करने के लिए मौजूदा कक्षा को परिवर्तित करके स्केलज़ में अपना पहला प्रयास कर रहा हूं। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह है कि यह सुनिश्चित करने के लिए कि मेरे वर्ग प्रकार पैरामीटर पर एक दृश्य निर्धारित किया जाए, यह केवल उन प्रकारों के साथ उपयोग किया जा सकता है जिन्हें पूर्ण रूप से एक मोनॉयड में परिवर्तित किया जा सकता है। मेरे (सरलीकृत) वर्ग परिभाषा इस प्रकार है:स्केलज़

import scalaz._ 
import Scalaz._ 

case class Foo[T <% Monoid[T]](v: T) 

new Foo(42) 

इस सरल उदाहरण संकलन संकलक त्रुटि देता है:

error: No implicit view available from Int => scalaz.Monoid[Int]. 

इससे पहले इस दृश्य के लिए बाध्य टी से करने के लिए एक अंतर्निहित रूपांतरण के साथ मेरे स्वयं के कस्टम विशेषता के खिलाफ परिभाषित किया गया था विशेषता और यह ठीक काम किया।

अब मुझे क्या याद आ रही है कि मैंने इसे स्केलज़ में परिवर्तित कर दिया है?

धन्यवाद, क्रिस

उत्तर

9

आप एक संदर्भ के लिए बाध्य है, और नहीं एक दृश्य वहाँ बाध्य का उपयोग करने की अपेक्षा की जाती है।

import scalaz._ 
import Scalaz._ 

case class Foo[T : Monoid](v: T) 

new Foo(42) 

T : Monoid अंकन का मतलब है कि वहाँ दायरे में प्रकार Monoid[T] का एक अंतर्निहित। वास्तव में, यह निम्न के desugars:

case class Foo[T](v: T)(implicit ev: Monoid[T]) 

इस प्रकार का वर्ग पद्धति के रूप में जाना जाता है और आप इसे here के बारे में अधिक पढ़ सकते हैं।

+0

शानदार। आपकी सहायता के लिए धन्यवाद. पता था कि यह कुछ स्पष्ट था। लिंक के लिए धन्यवाद - बाद में कुछ अच्छी पढ़ाई। –