हमें निरंतरता इकाई के निम्नलिखित कार्यान्वयन, सीपीएस शैली संगणना उपज और पूर्णांक के लिए पर विचार करें:कैसे निरंतरता इकाई
module Cont : sig
type 'a t = ('a -> int) -> int
val return : 'a -> 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t
val callCC: (('a -> 'b t) -> 'a t) -> 'a t
end = struct
type 'a t = ('a -> int) -> int
let return x =
fun cont -> cont x
let bind m f =
fun cont -> m (fun x -> (f x) cont)
let callCC k =
fun cont -> k (fun x -> (fun _ -> cont x)) cont
end
हम CPS- कैसे पुनर्लेखन कर सकते हैं जीसीडी गणना के शैली कार्यान्वयन (How to memoize recursive functions? देखें) और विशेष रूप से Cont monad का लाभ लेने के लिए ज्ञापन?
# let gcd memo ((a,b):int * int) =
Cont.callCC (memo gcd_cont (a,b)) (fun x -> x)
;;
val gcd :
(((int * int -> int Cont.t) -> int * int -> int Cont.t) ->
int * int -> (int -> 'a Cont.t) -> int Cont.t) ->
int * int -> int = <fun>
हालांकि मैं एक में इस संकेत बारी नहीं कर सका:
let gcd_cont k (a,b) =
let (q, r) = (a/b, a mod b) in
if r = 0 then Cont.return b else k (b,r)
परिभाषित करने के बाद मैं प्रकार solver उपयोग करने के लिए मुझे प्रकार है कि Memoization समारोह होना चाहिए के बारे में संकेत देने के लिए करने की कोशिश की वास्तविक कार्यान्वयन क्या कोई ऐसा करने में सक्षम है? ज्ञापन समारोह में "कॉलसीसी" का उपयोग करने के पीछे तर्क यह है कि यदि कैश में कोई मान मिलता है, तो यह प्रारंभिक निकास की स्थिति है।
सीपीएस नामकरण के लिए मेरा बुरा क्या नहीं है। क्या कार्यों के "उपकरण-सक्षम" संस्करण के विशिष्ट रूप के लिए कोई कैनोलिक नाम है? –