OCaml

2013-06-18 5 views
6

में ऑर्डर किए गए संस्करण प्रकार और उपप्रकार मैं वर्तमान में ओकैमल में कुछ महजोंग हैंड प्रोसेसिंग करने की कोशिश कर रहा हूं और शुरुआत से ही मुझे कुछ ऐसी चीजों से सामना करना पड़ रहा है जो मुझे बग करता है।OCaml

मैं आपको कार्ड के आधार पर उदाहरण दूंगा क्योंकि मैं किसी को महजोंग शब्दावली से भ्रमित नहीं करना चाहता हूं।

बस इस part on User-Defined Types from OCaml for the Skeptical में, मैं सूट, कार्ड और सबकुछ का वर्णन करने के लिए भिन्न प्रकारों का उपयोग करना चाहता हूं।

type suit = Club | Diamond | Heart | Spade 
type value = Jack | Queen | King | Ace | Num of int 
type card = Card of suit * value | Joker 
type hand = card list 

और यह वास्तव में अच्छा होगा अगर मैं एक स्मार्ट compare समारोह है कि भिन्न प्रकारों का आदेश दिया समझना होगा लिख ​​सकता होगा।

आदर्श रूप में मैं ऐसा ही कुछ लिखना चाहते हैं:

type suit = Club < Diamond < Heart < Spade 
type value = Num of int < Jack < Queen < King < Ace 
type card = Card of suit * value < Joker 
type hand = card list 

ताकि जब मैं

List.sort Pervasives.compare [Card(Diamond, Num 3); Joker; Card(Spade, Ace); Card(Diamond, Num 2)] 

कर यह मेरे

[Card(Diamond, Num 2); Card(Diamond, Num 3); Card(Spade, Ace); Joker] 

ओह, ocaml उच्चस्तरीय रिटर्न देता है

[Joker; Card(Spade, Ace); Card(Diamond, Num 2); Card(Diamond, Num 3)] 

(जो पहले से ही काफी अच्छा है!)

मूल रूप से मैं एक compare समारोह है कि प्रकार घोषणा संरचना से संकेत ले जाएगा चाहते हैं।

मैंने यह article on polymorphic compare और this similar question पढ़ा है, लेकिन मुझे यकीन नहीं है कि मैं compare_val पर निर्भर होना चाहता हूं।

क्या मुझे वास्तव में अपना खुद का तुलना फ़ंक्शन लिखना है? यदि आप मुझे एक लिखने की सलाह देते हैं, तो क्या आपके पास लिखे जाने वाले तरीकों पर सुझाव हैं, खासकर मामलों की संख्या को कम करने के लिए? के बारे में deriving(Ord) हास्केल में

पी.एस .: मैं सिर्फ सुना ... पर्याप्त मुझे छलांग लेने के लिए हो सकता है ...

+0

मुझे हास्केल से प्यार है, लेकिन मैं केवल 'व्युत्पन्न' चीनी के लिए ओकैमल पर जहाज नहीं कूदूंगा। विशेष रूप से इस प्रकार के लिए एक छोटे से। – jozefg

+0

यह भी अच्छा होगा अगर न्यूम को 1.10 – aneccodeal

+1

@aneccodeal yep से बाधित किया जा सकता है, किसी दिन हम मुख्यधारा की भाषा में निर्भर प्रकार प्राप्त करेंगे। – paob

उत्तर

8

हाँ, आप के लिए है। लेकिन आप छोड़ सकते हैं जहां polymorphic तुलना आपकी आवश्यकता के साथ मेल खाता है। उदाहरण के लिए, आपको सूट के लिए अपनी तुलना लिखने की आवश्यकता नहीं है।

हास्केल का व्युत्पन्न (ऑर्ड) पॉलिमॉर्फिक तुलना के समान है: यदि आप अपने दिमाग में ऑर्डरिंग में रचनाकारों को ऑर्डर कर सकते हैं, तो आप तुलना फ़ंक्शन प्राप्त कर सकते हैं। लेकिन यह अधिक शक्तिशाली है क्योंकि आप स्वचालित और कस्टम तुलना कार्यों को लिख सकते हैं। ओकैमल की बहुलक तुलना यह नहीं कर सकती है। उदाहरण के लिए,

type t = ... 
let compare_t = .... (* custom comparison for t *) 
type t2 = A of t | B of t | C of t (* I want to write a comparion for t2 now! *) 

निर्माता एक के बहुरूपी तुलना आदेश, बी और सी अपनी जरूरत है, तो आप t2 की तुलना के लिए इसका इस्तेमाल नहीं कर सकते हैं क्योंकि यह टी के लिए कस्टम तुलना कॉल नहीं कर सकते के साथ मेल खाता है। तो इस मामले में, अगर मैं आप थे तो मैं हाथ से तुलना_टी 2 लिखूंगा। कार्ड के आपके उदाहरण के लिए, यह आसानी से 3 मिनट में किया जाता है।

यदि आपके डेटा प्रकार विशाल हैं और आपके हाथ से सभी तुलनाओं को लिखना बेहद दर्द है, तो आप CamlP4 और type_conv का उपयोग करके परिभाषा कार्यों को तुलनात्मक रूप से उत्पन्न कर सकते हैं, जैसे कि व्युत्पन्न (Ord) करता है। लेकिन मुझे डर है कि कोई टाइप_कॉनवी मॉड्यूल नहीं है जो ऑर्ड को अभी तक पसंद करता है। व्यक्तिगत रूप से मैंने इसे कभी भी महसूस करने की आवश्यकता महसूस नहीं की है।यह पी 4 शिक्षार्थियों के लिए एक अच्छा अभ्यास होना चाहिए।

+0

उत्तर के लिए धन्यवाद! मुझे लगता है कि मैं प्रत्येक प्रकार के लिए 'तुलना' लिखने की कोशिश करूंगा। और अगर कोड वास्तव में बहुत फूला हुआ है, तो मैं CamlP4 पर एक नज़र डालेगा। – paob

+0

यदि आप पहले ही पी 4 से परिचित नहीं हैं, तो मैं आपको चेतावनी देता हूं, आपको इसके लिए एक महीने की उम्मीद करनी चाहिए :-) – camlspotter

+0

अच्छी तरह से, यह किसी भी समय सीमा के बिना खिलौना प्रोजेक्ट है तो क्यों नहीं =) – paob