संपादित में योग प्रकार (या तो बी) का प्रतिनिधित्व करने के लिए बेवकूफ तरीका। मेरा सवाल अब है: सांख्यिकीय रूप से प्रकार की भाषाओं में योग प्रकारों के बजाय आमतौर पर कौन सी मूर्खतापूर्ण क्लोजर संरचनाएं उपयोग की जाती हैं? आम सहमति: अब प्रोटोकॉल का उपयोग करें यदि व्यवहार को एकीकृत किया जा सकता है, टैग किए गए जोड़े/मानचित्रों का उपयोग अन्यथा करें, पूर्व-और बाद की स्थितियों में आवश्यक आवेषण दें।क्लोजर
Clojure उत्पाद प्रकार व्यक्त करने के लिए कई तरीके प्रदान करता है: वैक्टर, नक्शे, रिकॉर्ड ..., लेकिन कैसे आप sum types का प्रतिनिधित्व करते हैं, भी टैग किया यूनियनों और संस्करण रिकॉर्ड के रूप में जाना जाता है? हास्केल में Either a b
या स्कैला में Either[+A, +B]
की तरह कुछ।
पहली बात जो मेरे दिमाग में आती है वह एक विशेष टैग वाला नक्शा है: {:tag :left :value a}
, लेकिन फिर सभी कोड (:tag value)
पर सशर्त के साथ प्रदूषित होने जा रहे हैं और यदि यह नहीं है तो विशेष मामलों को संभालना ... मैं क्या हूं ' डी यह सुनिश्चित करना है कि :tag
हमेशा वहां होता है, और यह केवल निर्दिष्ट मानों में से एक ले सकता है, और संबंधित मान लगातार उसी प्रकार/व्यवहार का होता है और nil
नहीं हो सकता है, और यह देखने का एक आसान तरीका है कि मैंने लिया कोड में सभी मामलों की देखभाल।
मैं
defrecord
की तर्ज में किसी मैक्रो के बारे में सोच सकते हैं, लेकिन योग प्रकार के लिए:
; it creates a special record type and some helper functions
(defvariant Either
left Foo
right :bar)
; user.Either
(def x (left (Foo. "foo"))) ;; factory functions for every variant
; #user.Either{:variant :left :value #user.Foo{:name "foo"}}
(def y (right (Foo. "bar"))) ;; factory functions check types
; SomeException...
(def y (right ^{:type :bar}()))
; #user.Either{:variant :right :value()}
(variants x) ;; list of all possible options is intrinsic to the value
; [:left :right]
इस तरह की एक बात यह है कि पहले से ही मौजूद है?
(उत्तर:)।
LispCast पर एक महान जवाब: http://www.lispcast.com/idiomatic-way-to-represent-either – sastanin