2013-01-17 12 views
6

मैं Programming languages पाठ्यक्रम के साथ मानक एमएल सीखना शुरू कर रहा हूं।एसएमएल और कार्यात्मक कोडिंग शैली

पहले होमवर्क में, मैं एक समारोह is_older लिखने का प्रयास करता हूं जो दो तिथियां लेता है और true या false पर मूल्यांकन करता है। यह true का मूल्यांकन करता है यदि पहला तर्क एक तारीख है जो दूसरे तर्क से पहले आता है (यदि दो तिथियां समान हैं, तो परिणाम false है।)।

तो मैं निम्नलिखित कोड लिखें:

fun is_older(first: int * int * int, second: int * int * int) = 
    if(#1 first = #1 second andalso #2 first = #2 second andalso #3 first = #3 second) then false 
    else if (#1 first < #1 second) then true 
    else if (#1 first = #1 second andalso #2 first < #2 second) then true 
    else if (#1 first = #1 second andalso #2 first = #2 second andalso #3 first < #3 second) then true 
    else false 

कोड है ठीक काम करता है, लेकिन यह बदसूरत लग रहा है।

मैं इस कोड को कार्यात्मक शैली में कैसे लिख सकता हूं?

उत्तर

12

दो सुझाव:

  • उपयोग पैटर्न tuples विघटित मिलान।
  • उपयोग बूलियन ऑपरेटरों (andalso, orelse, आदि) if/else निर्माणों बूलियन लौट जब।

एक अधिक पठनीय संस्करण:

(* Compare two dates in the form of (year, month, day) *) 
fun is_older((y1, m1, d1), (y2, m2, d2)) = 
    y1 < y2 orelse (y1 = y2 andalso m1 < m2) 
    orelse (y1 = y2 andalso m1 = m2 andalso d1 < d2) 
9

सामान्य तौर पर जब आप फार्म पर कुछ है

if b then 
    true 
else 
    false 

आप, बस b के साथ आदान-प्रदान करना चाहिए के रूप में यह तुच्छता से देखा जाता है होना करने के लिए वही। पैड द्वारा प्रदान किया गया समाधान शायद मेरा समाधान भी होगा, क्योंकि यह अच्छा और छोटा है।

लेकिन जब आप उन बुरा/नेस्ट अगर-तो-और की हो रही अंत, और आप कुछ सरल नहीं लौटते हैं (जैसे, सही/गलत या एक नंबर), तो आप एक मामले के उपयोग पर विचार करना चाहिए। आपका समारोह का उपयोग करने के लिए एक प्रमुख उम्मीदवार नहीं है, लेकिन मुझे उम्मीद है कि नीचे अभी भी विचार से पता चलता दूसरों को अपने जवाब propposal को समझने में मदद मिलेगी कुछ टिप्पणियां जोड़ना (जिन्हें आप आसानी से अगर के नेस्ट उन की संरचना कर सकते हैं)

fun is_older((y1, m1, d1), (y2, m2, d2)) = 
    case (Int.compare(y1,y2), Int.compare(m1,m2), Int.compare(d1, d2)) of 
     (LESS , _ , _ ) => true 
    | (EQUAL, LESS , _ ) => true 
    | (EQUAL, EQUAL, LESS) => true 
    | _ => false 
1
fun is_older((yr1 : int , mo1 : int , dt1 : int), (yr2 : int , mo2 : int , dt2 : int)) = 
    yr1 < yr2 orelse (yr1 = yr2 andalso mo1 < mo2) 
    orelse (yr1 = yr2 andalso mo1 = mo2 andalso dt1 < dt2) 
+1

। – Yaroslav

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