क्या हास्केल के लिए समीकरण विस्तारक मौजूद है?हास्केल: समीकरण विस्तारक 1+ (1+ (1+ (1+ (...))) = ∞
कुछ foldr.com की तरह: 1+(1+(1+(1+(…))))=∞
मैं Haskell करने के लिए मैं मुसीबत समझ क्यों कुछ समीकरणों दूसरों की तुलना में अधिक बेहतर हैं हो रहा है नया हूँ। मुझे लगता है कि अगर मैं समीकरणों को विस्तारित देख सकता हूं तो इससे मदद मिलेगी।
उदाहरण के लिए मैंने foldr
बनाम foldl
को तब तक समझना मुश्किल था जब तक कि मैंने उन्हें विस्तारित नहीं किया।
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr k z xs = go xs
where
go [] = z
go (y:ys) = y `k` go ys
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f z0 xs0 = lgo z0 xs0
where
lgo z [] = z
lgo z (x:xs) = lgo (f z x) xs
परिभाषाओं से मैं देख सकता हूँ कि foldr
इस तरह फैलता है:
foldr (+) 0 [1..1000000] -->
1 + (foldr (+) 0 [2..1000000]) -->
1 + (2 + (foldr (+) 0 [3..1000000])) -->
1 + (2 + (3 + (foldr (+) 0 [4..1000000]))) -->
1 + (2 + (3 + (4 + (foldr (+) 0 [5..1000000])))) -->
और foldl
इस तरह फैलता है:
foldl (+) 0 [1..1000000] -->
foldl (+) (foldl (+) 0 [1]) [2..1000000]) -->
foldl (+) (foldl (+) (foldl (+) 0 [1])) [3..1000000]) -->
या Haskell Wiki on foldr fold foldl' से:
let z1 = 0 + 1
in foldl (+) z1 [2..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
in foldl (+) z2 [3..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
z3 = z2 + 3
in foldl (+) z3 [4..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
z3 = z2 + 3
z4 = z3 + 4
in foldl (+) z4 [5..1000000] -->
हालांकि, मुझे बड़े समीकरणों को समझने में परेशानी है कि चीजें हास्केल में जिस तरह से काम करती हैं। उदाहरण के लिए पहला चलनी फ़ंक्शन 1000 फ़िल्टर का उपयोग करता है जबकि दूसरा चलनी फ़ंक्शन 1001 प्राइम ढूंढने के लिए केवल 24 लेता है।
primes = sieve [2..]
where
sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]
primes = 2: 3: sieve (tail primes) [5,7..]
where
sieve (p:ps) xs = h ++ sieve ps [x | x <- t, rem x p /= 0]
-- or: filter ((/=0).(`rem`p)) t
where (h,~(_:t)) = span (< p*p) xs
मैं एक अच्छा खर्च किया है काम कर रहे हैं और हाथ से विस्तार हो रहा है। मुझे समझ में आया है कि यह कैसे काम करता है। हालांकि, कुछ अभिव्यक्तियों का विस्तार करने के लिए एक स्वचालित उपकरण हास्केल की मेरी समझ में काफी सुधार करेगा।
इसके अलावा मुझे लगता है कि यह भी सवाल है कि हास्केल कोड अनुकूलन करने के लिए की तलाश में मदद करने के सेवा कर सकता है:
- Optimizing Haskell Code
- Help optimize my haskell code - Calculate the sum of all the primes below two million
वहाँ हास्केल भाव का विस्तार करने के लिए एक उपकरण है?
मुझे लगता है कि मुझे हैकेल कैफे मेलिंग सूची में कुछ याद है जो लगभग आप चाहते थे। मुझे लगता है कि इसमें एक विशेष संख्या उदाहरण के साथ एक नया प्रकार शामिल है, लेकिन मेरी याददाश्त अस्पष्ट है, मुझे यकीन नहीं है कि मैं इसे पा सकता हूं। –
+1 - अच्छी पोस्ट। –