2016-04-30 9 views
5

मुझे defaultArg फ़ंक्शन को Lazy के साथ दूसरे पैरामीटर के रूप में कार्यान्वित करने की आवश्यकता है।क्या F # defaultArg आलसी स्वीकार करने का मानक कार्यान्वयन है?

defaultArgLazy option (lazy doSomeHeavyWorkThatShouldBeAvoided()) 

यह काफी

let defaultArgLazy o (p:'a Lazy) = 
    match o with 
    | Some v -> v 
    | None -> p.Force() 

लागू करने के लिए आसान है लेकिन मुझे आश्चर्य है कि अगर वहाँ एक मानक कार्यान्वयन है कि मैं याद कर रहा हूँ है: यहाँ एक के उपयोग का उदाहरण है।

+0

नहीं, इसके लिए कुछ भी मानक नहीं है। – scrwtp

उत्तर

1

मैं में बनाया कुछ भी पता नहीं है, लेकिन यहाँ अपने कार्य की एक अधिक सामान्य संस्करण है:

module Option = 
    let lazyDefault f opt = 
     match opt with 
     | Some x -> x 
     | None -> f() 

let lazyVal = lazy 1 
let opt = None 

opt |> Option.lazyDefault lazyVal.Force // returns 1 

यह (unit -> 'a) के किसी भी समारोह लेता बजाय विशेष रूप से एक Lazy<'a>' है, तो आप सिर्फ लेज़ी के Force के माध्यम से पारित इसके बजाय विधि, और गारंटी बनाए रखें कि मूल्यांकन केवल एक बार होता है।

शायद Lazy.Force() .NET के मौजूदा Lazy.Value के शीर्ष पर F # में जोड़ा गया था ताकि आप उच्च आदेश कार्यों के साथ इसे अधिक idiomatically उपयोग कर सकें।

ध्यान दें कि मैंने अंतर्निहित defaultArg की तुलना में पैरामीटर ऑर्डर को बदल दिया है ताकि अन्य मॉड्यूल में फ़ंक्शंस के साथ अधिक संगत हो और पाइपिंग/करीइंग के लिए अधिक सुविधाजनक हो।

1

यदि आलसी मान केवल कोड के बाद के बिंदु पर उपयोग किया जाता है, तो यह defaultArg का उपयोग करने का विचार भी हो सकता है और इसे पहले तर्क के रूप में Lazy<'a> option पास कर सकता है। इस तरह का विकल्प चुनने पर विकल्प या डिफ़ॉल्ट तर्क चुनने से अलग किया जाता है। के रूप में TheQuickBrownFox से एक है -

इस विचार, समारोह

let defaultArgLazy opt lazyDef = 
    (defaultArg (Option.map Lazy.CreateFromValue opt) lazyDef).Value 

आप क्या चाहते हैं करना होगा ले रहा है।

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