मुझे उलझन में है कि कैसे भिन्न और अलग-अलग प्रकार को बाध्य करते हैं।अंदर घुसपैठ
(def leven
(memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (leven (rest x) y) 1)
(+ (leven x (rest y)) 1)
(+ (leven (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)))
)
लेकिन जब मैं समारोह की घोषणा करने की कोशिश यह संकलन करने में विफल रहता है जाने के रूप में: तकनीक अंकुर द्वारा पता चला है का उपयोग कर, यह काम करता है:
(def leven
(let [l (memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (l (rest x) y) 1)
(+ (l x (rest y)) 1)
(+ (l (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))]
(l x y)
)
)
संपादित क्यों यह काम करता है किसी ने मुझे बता सकते हैं।
(defn leven [x y]
(let [l (memoize (fn [f x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (f f (rest x) y) 1)
(+ (f f x (rest y)) 1)
(+ (f f (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))
magic (partial l l)]
(magic x y)
)
)
बहुत रोचक। तो आप मूल रूप से केवल एक तर्क के रूप में कार्य में गुजर रहे हैं ताकि संकलक परिभाषित न किए जाने के बारे में भ्रमित न हो। मैं अब यह कोशिश नहीं कर सकता, लेकिन मैं बाद में इस दृष्टिकोण को आजमाने की कोशिश कर रहा हूं। – onit