/ / एफ # सूची पर निरंतरता आधारित पूंछ पुनरावृत्ति - पुनरावृत्ति, एफ #

एफ # सूची पर निरंतर आधारित पूंछ रिकर्सन - रिकर्सन, एफ #

मेरे पास यह एक बहुत ही सरल कार्य है जो एक इंट लेता है और इसे सूची के प्रमुख में जोड़ता है और इसे पुनरावर्ती रूप से i के साथ गुणा किया जाता है:

let rec f i = function
| []    -> []
| x::xs -> (x+i)::f (i*i) xs

f 2 [1;2;3]
val it : int list = [3; 6; 19]

अब, मैं इसे एक निरंतरता का उपयोग करके फिर से लिखने का प्रयास कर रहा हूं, लेकिन मैं थोड़ा अटक गया हूं। यहाँ मैं क्या कर रहा हूँ "अब तक के साथ आते हैं:

let fC i l =
let rec loop cont = function
| []    -> []
| x::xs -> cont(x+i)::loop (fun acc -> (acc*acc)) xs
loop id l

fC 2 [1;2;3] //Expected [3;6;19]
val it : int list = [3; 16; 25]

क्या मैं गलत कर रहा हूँ के लिए कोई संकेत?

उत्तर:

जवाब के लिए 5 № 1

इस प्रश्न और टिप्पणियों को देखकर मुझे लगता है कि कुछ भ्रम है।

पूंछ पुनरावर्ती आवश्यक निरंतरता गुजर शैली (सीपीएस) नहीं है।

यहाँ सीपीएस में समारोह है:

let f" i p =
let rec loop i p k =
match p with
| []    -> k []
| x::xs -> loop (i*i) xs (fun a -> k ((x+i)::a))
loop i p id

और निश्चित रूप से, यह पुनरावर्ती है। लेकिन आप इसे एक निरंतरता के बजाय एक संचायक का उपयोग करके पूंछ पुनरावर्ती भी लिख सकते हैं:

let f"" i p =
let rec loop i p acc =
match p with
| []    -> acc
| x::xs -> loop (i*i) xs ((x+i)::acc)
loop i p [] |> List.rev

यह भी देखें इस सवाल का जवाब बेहतर समझने के लिए सी.पी.एस.