elm / compiler

Compiler for Elm, a functional language for reliable webapps.
https://elm-lang.org/
BSD 3-Clause "New" or "Revised" License
7.48k stars 659 forks source link

`elm make` hang then runaway memory usage from orphan process #2241

Open javanwood opened 2 years ago

javanwood commented 2 years ago

Quick Summary: Compilation hangs and an elm process remains active after <ctrl-c>. Memory usage of this process reaches >16GB (memory available to system) which bogged down my system.

SSCCE

module Main exposing (..)

foldMap : (a -> b) -> (a -> c) -> (b -> c -> c) -> a -> c
foldMap fab fac fbc a = fac a

break : Float -> (Float, Float)
break input = foldMap identity (\x -> (x, x)) (\( low, high ) x -> ( min low x, max high x )) input

Additional Details

elm make hangs after printing Compiling .... The orphan elm process only continues if waiting for longer than 5-6 seconds before using to cancel the elm make command.

When changing (\( low, high ) x -> to (\x ( low, high ) -> the snippet compiles as expected, and changing ( min low x, max high x ) to ( x, x ) results in the compiler error `foldMap` needs the 4th argument to be: ( ∞, ∞ ).

Came across this writing a foldMap to calculate the min and max of a List Float but have simplified to get a minimal reproduction.

Love your work!

github-actions[bot] commented 2 years ago

Thanks for reporting this! To set expectations:

Finally, please be patient with the core team. They are trying their best with limited resources.

maxime-didier commented 2 years ago

Hello,

We encountered the same problem in our code after I mistakenly swapped the arguments of the set function in a lens. It looks to me that we encountered the same typechecker bug:

module Main exposing (..)

type alias Lens a b =
  { get : a -> b
  , set : b -> a -> a
  }

oopsLens : Lens { b | oops : a } b
oopsLens = Lens .oops (\x oops -> { x | oops = oops })
pete-murphy commented 6 months ago

Ran into a similar issue, though not from mistakenly swapping arguments, this was from a use of elm-form that I thought would actually compile. Boiled it down to

module Main exposing (..)

type X r
    = X

f : X r -> X { r | y : () }
f _ =
    X

x : X { z : () }
x =
    X

example : ()
example =
    x
        |> (if True then
                f

            else
                identity
           )
        |> always ()

That causes elm make to hang and balloon in memory usage (even after exiting with Ctrl+c).