Ian, that is a great thought, but even if we split the list exactly in
half, the call stack fills up when the list length gets to around 4500.

partition _ list =
  let
    n = List.length list // 2
  in
    (List.take n list, List.drop n list)

In my specific problem, the "wrap" function finds the smallest rectangular
prism that encloses a set of 3D points. The "partition" function splits the
list of points in half, with a plane that is aligned with one of the box's
axes. I have a lot of tests to ensure the function doesn't break in weird
cases, like all of the points being identical. So I am pretty sure the
partition is doing a reasonable split.

I am taking a look at the trampoline library now...

On Tue, Jul 12, 2016 at 12:03 AM, Janis Voigtländer <
[email protected]> wrote:

> Maybe the Trampoline library can help you?
>
> http://package.elm-lang.org/packages/elm-lang/trampoline/1.0.0/Trampoline
>
>
> Am Dienstag, 12. Juli 2016 schrieb Nick H :
>
>> Here is a puzzle for you:
>>
>> For a large enough list, the code below will fill up the call stack and
>> crash. It makes sense that the Elm compiler can't optimize it with tail
>> calls, since the recursive function gets called more than once per
>> iteration.
>>
>> What is the best way to rewrite this without using recursion?
>>
>>
>>
>> type Tree = Leaf Foo | Node Bar Tree Tree
>>>
>>> create : List Foo -> Tree
>>> create faces =
>>>   case faces of
>>>     [] ->
>>>       dummyFoo
>>>
>>>     foo :: [] ->
>>>       Leaf f
>>>
>>>     list ->
>>>       let
>>>         box = wrap list
>>>
>>>         ( left, right ) = partition box list
>>>       in
>>>         Node box (create left) (create right)
>>>
>>> wrap : List Foo -> Bar
>>>
>>> partition : Bar -> List Foo -> (List Foo, List Foo)
>>>
>>> --
>> 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.
>>
> --
> 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.
>

-- 
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