2013-09-27 6 views
8

तो कोड गोल्फ के लिए मुझसे पूछा, मैंऑपरेटर्स किसी interpretter एक बहुत छोटे से सूत्र के लिए

val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> /) 

की तरह कुछ करने के लिए कीवर्ड और कार्यों वे वर्णन के बीच त्वरित रूपांतरण की अनुमति चाहता था। इस वाक्यविन्यास ने न केवल पार्स किया है, लेकिन मैंने कोशिश की अन्य शॉर्टैंड सिंटैक्स में से कोई भी नहीं (_ + _, _:Int.+_) पार्स किया। क्या फ़ंक्शन शॉर्टैंड के रूप में ऐसा करने का कोई तरीका है, या क्या मैं अपने गोल्फ स्कोर को बर्बाद कर, लैम्ब्स को पूरी तरह से लिखने के लिए बर्बाद हूं।

संपादित करें: प्रश्न में समस्या केवल पूर्णांक थी। मैं समझता हूं कि अधिभार से यह अन्यथा मुश्किल हो जाएगा।

+2

एक ही रास्ता मैं होगा 'पता वैल ऑप्स = मानचित्र [स्ट्रिंग, (इंट इंट) => इंट] (" प्लस "-> (_ + _), "शून्य" -> (_ - _)); 'यह बहुत से लोगों को नहीं बचाता है हालांकि पात्र ... मैं उत्सुक हूं कि अधिक अनुभवी/स्मार्ट लोग सुझाव देंगे। :) –

+0

@ Patrykwwiek यदि ओपी किसी भी मूल्य के लिए सामान्य अपरिवर्तनीय चाहता है, तो लैम्ब्डा मदद नहीं करेगा, क्योंकि इस ऑपरेशन को – 4lex1v

+0

@AlexIv True overloaded है, यह विशेष है। मुझे इस सवाल में '_: Int' एनोटेशन द्वारा माना गया कि एक सरल' (Int, Int) => Int' पर्याप्त होगा। यदि यह एक सामान्य सवाल है तो मैं विचारों से बाहर हूं। :) –

उत्तर

5

यह सुनिश्चित नहीं है कि अतिरिक्त कार्य को परिभाषित करके आपका स्कोर कैसा प्रभावित होता है। आप ऑपरेटरों उठा सकता है, कुछ इस तरह का उपयोग कर:

def ↑(f:(Int,Int)=>Int) = f 
val ops = Map("plus" -> ↑(_+_), "minus" -> ↑(_-_), "times"-> ↑(_*_), "div" -> ↑(_/_)) 

और ओम-nom-nom टिप्पणी के रूप में, यह स्पष्ट उठाने के द्वारा किया जा सकता है:

def lift(f:(Int,Int)=>Int) = f 
val ops = Map("plus" -> lift(_+_), "minus" -> lift(_-_), "times"-> lift(_*_), "div" -> lift(_/_)) 

और आप कुछ वर्ण दाढ़ी बनाने के लिए चाहते हैं, तो संकलक के साथ-साथ उठाने coerse के प्रकार हस्ताक्षर प्रदान करके:

val ops: Map[String, (Int,Int) => Int] = Map("plus" -> (_+_), "minus" -> (_-_), "times"->(_*_), "div" -> (_/_)) 
+2

'वैल ऑप्स से कहीं अधिक बेहतर नहीं है: मानचित्र [स्ट्रिंग, (Int, Int) => Int] = मानचित्र (" प्लस "-> (_ + _)," minus "-> {_-_}, "times" -> {_ * _}, "div" -> {_/_}) '(या तो() या {} ब्रेसिज़) –

+0

@ ओम-नाम-नाम हाँ, मैं गाड़ी चला रहा था वापस घर सोच ... विधि उठाने को संकलक द्वारा स्वचालित रूप से किया जाता है और महसूस किया जाता है कि इसे केवल प्रकार हस्ताक्षर की आवश्यकता है। – maasg

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