2015-01-29 13 views
5

की Shapeless Features Overview Monomorphism` उदाहरण निम्न उदाहरण दिखाता है:समझौता `निराकार

import poly._ 

// choose is a function from Sets to Options with no type specific cases 
object choose extends (Set ~> Option) { 
    def apply[T](s : Set[T]) = s.headOption 
} 

scala> choose(Set(1, 2, 3)) 
res0: Option[Int] = Some(1) 

scala> choose(Set('a', 'b', 'c')) 
res1: Option[Char] = Some(a) 

हालांकि, मैं नहीं करते हैं, निराकार के साथ अनुभव के मीटर अभाव में, निम्नलिखित कि और के बीच अंतर समझना:

scala> def f[T](set: Set[T]): Option[T] = set.headOption 
f: [T](set: Set[T])Option[T] 

scala> f(Set(1,2,3)) 
res0: Option[Int] = Some(1) 

scala> f(Set('a', 'b', 'c')) 
res1: Option[Char] = Some(a) 

उत्तर

7

यहां महत्वपूर्ण अंतर यह है कि choose एक ऐसा कार्य है जिसे मूल्य के रूप में पारित किया जा सकता है। तुम एक (उचित) मूल्य f से बाहर नहीं कर सकते हैं, के बाद से स्काला बहुरूपी समारोह मूल्यों का समर्थन नहीं करता:

scala> val fun = f _ 
fun: Set[Nothing] => Option[Nothing] = <function1> 

जैसा कि आप देख, स्काला Nothing के तत्व प्रकार गैर खाली सेट के लिए बेकार समारोह प्रतिपादन ठीक करता है:

scala> fun(Set(1)) 
<console>:10: error: type mismatch; 
found : Int(1) 
required: Nothing 
       fun(Set(1)) 
        ^

यह काम करता है जैसा कि आप बेकार दृष्टिकोण के साथ अपेक्षा करेंगे।

+0

स्पष्टीकरण के लिए धन्यवाद। Walkthrough में अगला उदाहरण, 'pairApply', भी एक अच्छा उदाहरण है। कृपया मुझे बताएं, 'def'' को 'def' के माध्यम से फ़ंक्शन के रूप में लिखा जा सकता है? मैं उत्सुक हूं कि 'ऑब्जेक्ट ...' दृष्टिकोण क्यों लिया गया था। –

+0

'select' किसी ऑब्जेक्ट पर * विधि * के रूप में लिखा जा सकता है, लेकिन यह * फ़ंक्शन * (ए * मान * प्रकार' फंक्शन 1') नहीं हो सकता है। इसे 'ऑब्जेक्ट' के रूप में रखने का लाभ यह है कि आप इसे सामान्यता को खोए बिना किसी अन्य फ़ंक्शन में पास कर सकते हैं: 'def लागू करें टॉइन्ट्स एंडस्ट्रिंग्स (मैपर: सेट ~> विकल्प): (विकल्प [Int], विकल्प [स्ट्रिंग]) = (मैपर (सेट (1, 2), मैपर (सेट ("हैलो"))) ') और फिर हम' applyToIntsAndStrings (चुनें) 'को कॉल कर सकते हैं। आप इसे सामान्य 'डीफ़' के साथ नहीं कर सकते हैं। – lmm

संबंधित मुद्दे