Functional ‘while’ loops – no, really
billwadge.wordpress.com
billwadge.wordpress.com
nodups = dedup [] where
dedup m [] = m
dedup m (x:xs) = dedup (if x `elem` m then m else m++[x]) xs
as some syntactic sugar while loop: nodups l = while k != []
k = l ||| tail l
m = [] ||| if head k `elem` m then m else m ++ head k
result = m
but I would disagree. Btw, the former appears to suffer from quadratic slowdown due to repeated use of ++ which can be avoided by replacing m++[x] with x:m and making dedup m [] = reverse m.Mine have multiple variables, no monads, and no side effects - it all gets done by tail recursion.
I think it would have been cleaner to pass the value the loop should return to a break primitive and otherwise compute it in a dedicated block.
If the condition is false before entering the loop then result would be 1 (its initial value)
if it helps and if I understand correctly, this would be the same algorithm expressed in scheme:
(define (fib n) (let loop ([i 1] [f 1] [pf 1]) (if (< i n) (loop (+ i 1) (+ f pf) f ) f )))
((let name args body) is essentially sugar for creating a function and calling it with some default args)
Looks like I fooled some people into assuming that whiles are imperative. They're not