You might need to do optimizations until there are no more changes to make. 
 Conceptually, you can express it as a while loop.

On Monday, July 10, 2017 at 8:28:15 AM UTC-7, Erkal Selman wrote:
>
> What exactly do you need the while-loop for?
>
> On Thursday, July 6, 2017 at 7:04:18 AM UTC+2, John Bugner wrote:
>>
>> In imperative OO languages, there are for/while loops:
>>
>> A for-loop often looks like this:
>>
>>     for (i = 0; i < 100; i++) {
>>       a[i] = f(i);
>>     }
>>
>> In Elm (and Haskell), we have the neat `map` function that captures this 
>> pattern:
>>
>>     map f a
>>
>> A while-loop looks like this:
>>
>>     while (!isDone(s)) {
>>       f(s);
>>     }
>>
>> Haskell has the `until` function that captures this pattern:
>>
>>     until isDone f s
>>
>> Elm lacks this function. Is there a reason why? What's the current elmic 
>> way of doing this? Explicit recursion, I assume?
>>
>> Anyways, it seems that somebody else already yearned for `until` like me, 
>> and made this module: 
>> http://package.elm-lang.org/packages/Chadtech/elm-loop/1.0.2/Loop ...
>>
>> I note though, that he changed the order of the arguments from Haskell's 
>> `(a -> Bool) -> (a -> a) -> a -> a` to `(a -> Bool) -> a -> (a -> a) -> a`. 
>> I'm not sure why. If he wanted to match the usual impOO order, then why not 
>> `a -> (a -> Bool) -> (a -> a) -> a` instead ? Anyways, I think Haskell's 
>> order is the right order, because it let's you make useful closures, like 
>> this:
>>
>>     collatz : Int -> Int
>>     collatz =
>>       let
>>         u : Int -> Int
>>         u n =
>>           if isEven n
>>           then n // 2
>>           else 3 * n + 1
>>       in
>>         until ((==) 1) u
>>
>> This function is elegantly defined, but not very useful, because the 
>> result of every (positive) number will simply return 1 (mathematicians 
>> strongly suspect so, anyways). What's interesting is the *sequence* that a 
>> number makes on it's way down to 1. So I made a function that repeats like 
>> `until`, but also records each intermediate result in a list, like `scanl`:
>>
>>     scanUntil : (a -> Bool) -> (a -> a) -> a -> List a
>>     scanUntil p u s =
>>       let
>>         p_ : List a -> Bool
>>         p_ xs = case xs of
>>             [] -> True
>>             x :: _ -> p x
>>         u_ : List a -> List a
>>         u_ xs = case xs of
>>             [] -> []
>>             x :: _ -> u x :: xs
>>       in
>>         until p_ u_ [s]
>>
>> I'm not sure that `scanUntil` is the best name. Can anybody think of a 
>> better name? I also note that list that it returns is reversed compared to 
>> `scanl`'s and Haskell's `iterate` function ( 
>> https://hackage.haskell.org/package/base-4.7.0.2/docs/Prelude.html#v:iterate 
>> ), but feels right because the most useful value is probably going to be 
>> the last one calculated. But maybe this doesn't matter, because if you 
>> really want the last one calculated, then you'd just use `until` instead 
>> anyways.
>>
>> Anyways... answers, thoughts, and comments are welcome.
>>
>>

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to