Looks cool! I've sent you some questions and comments in a separate e-mail.
On Wednesday, 13 July 2016 09:39:56 UTC+10, Nick H wrote: > > It is! http://package.elm-lang.org/packages/nphollon/collision/1.0.2/ > > I was going to solicit feedback here on elm-discuss once I got this bug > sorted out. Until then, I've purposely kept the API to a bare minimum. > Would love to hear your thoughts! > > On Tue, Jul 12, 2016 at 4:14 PM, Ian Mackenzie <[email protected] > <javascript:>> wrote: > >> Good to know! >> >> By the way, is the original code you were working on part of an >> open-source library, by any chance? I'm working on some 2D/3D geometric >> libraries for Elm myself, including stuff like bounding boxes and spatial >> trees much like the one you describe. Might would be worth seeing if there >> are places we can collaborate (or at least not duplicate work if we don't >> need to). >> >> On Wednesday, 13 July 2016 07:15:21 UTC+10, Nick H wrote: >>> >>> Well, it turns out the bug isn't in my code. It is in elm-lang/core >>> <https://github.com/elm-lang/core/issues/601>. >>> >>> List.take fills ups the call stack all on its own: >>> >>> main = [ 1 .. 5000 ] |> List.take 2500 |> toString |> Html.text >>> >>> List.drop does not have this problem. If we redefine the partition >>> function solely in terms of List.drop, even the code in the OP works fine! >>> >>> partition _ foos = >>> let >>> n = List.length foos // 2 >>> in >>> ( List.reverse foos |> List.drop (n+1) |> List.reverse, List.drop >>> n foos ) >>> >>> I am happy that I learned how to use trampolines though. Maybe it will >>> come in handy some day :-) >>> >>> On Tue, Jul 12, 2016 at 11:17 AM, Nick H <[email protected]> wrote: >>> >>>> So I felt this 0.16 tutorial >>>> <https://www.classes.cs.uchicago.edu/archive/2015/winter/22300-1/lectures/TailRecursion.html> >>>> >>>> helped me understand trampolines better. Then it took a bit of work >>>> rewriting `create` in a way that utilized tail calls. But the new version >>>> is still failing with "too much recursion." Adding or removing the >>>> trampolines doesn't seem to make a difference. >>>> >>>> Below is a SSCCE, with dummy implementations for wrap and partition. In >>>> anybody has insight into what I am doing wrong, I would really appreciate >>>> it! >>>> >>>> module Main exposing (..) >>>> >>>> import Html >>>> import Dict exposing (Dict) >>>> import Trampoline exposing (Trampoline) >>>> >>>> >>>> main = >>>> [1..4500] |> create |> toString |> Html.text >>>> >>>> >>>> create : List Foo -> Tree >>>> create foos = >>>> Trampoline.evaluate (descend foos []) >>>> >>>> >>>> type Partial >>>> = LeftBranch Bar (List Foo) >>>> | RightBranch Bar Tree >>>> >>>> >>>> descend : List Foo -> List Partial -> Trampoline Tree >>>> descend incomplete stack = >>>> case incomplete of >>>> [] -> >>>> Trampoline.jump (\_ -> ascend (Leaf emptyFoo) stack) >>>> >>>> foo :: [] -> >>>> Trampoline.jump (\_ -> ascend (Leaf foo) stack) >>>> >>>> _ -> >>>> Trampoline.jump >>>> (\_ -> >>>> let >>>> bar = >>>> wrap incomplete >>>> >>>> ( left, right ) = >>>> partition bar incomplete >>>> in >>>> descend left (LeftBranch bar right :: stack) >>>> ) >>>> >>>> >>>> ascend : Tree -> List Partial -> Trampoline Tree >>>> ascend complete stack = >>>> case stack of >>>> [] -> >>>> Trampoline.done complete >>>> >>>> (LeftBranch parent sibling) :: remainder -> >>>> Trampoline.jump >>>> (\_ -> >>>> descend sibling (RightBranch parent complete :: >>>> remainder) >>>> ) >>>> >>>> (RightBranch parent sibling) :: remainder -> >>>> Trampoline.jump >>>> (\_ -> >>>> ascend (Node parent sibling complete) remainder >>>> ) >>>> >>>> >>>> type alias Bar = >>>> String >>>> >>>> >>>> type alias Foo = >>>> Int >>>> >>>> >>>> type Tree >>>> = Leaf Foo >>>> | Node Bar Tree Tree >>>> >>>> >>>> wrap : List Foo -> Bar >>>> wrap = >>>> toString >>>> >>>> >>>> partition : Bar -> List Foo -> ( List Foo, List Foo ) >>>> partition _ foos = >>>> let >>>> n = >>>> List.length foos // 2 >>>> in >>>> ( List.take n foos, List.drop n foos ) >>>> >>>> >>>> emptyFoo : Foo >>>> emptyFoo = >>>> 0 >>>> >>>> >>>> On Tue, Jul 12, 2016 at 10:08 AM, Max Goldstein <[email protected]> >>>> wrote: >>>> >>>>> Nah, trampoline takes some mental gymnastics! Hope it's helpful for >>>>> your tree problem. >>>>> >>>>> -- >>>>> 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] <javascript:>. >> 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.
