I’m just starting out with Elm and I’m having trouble with the following code. Perhaps someone can help me out.
The idea is to define an
AltTree type where some nodes can have multiple alternate subtrees with one of the choices selected. I then have a
decide function of type
AltTree a -> Tree a whose job it is to “evaluate” all the choices. Here is the code:
module AltTree exposing (..) import Array exposing (Array) type Tree a = Node (List a) | Leaf a type AltTree a = Seq (List (AltTree a)) | Choice Int (Array (AltTree a)) | AltLeaf a decide : AltTree a -> Tree a decide tree = case tree of Seq subtrees -> Node (List.map decide subtrees) Choice i subtrees -> case (Array.get i subtrees) of Just x -> decide x Nothing -> Node  AltLeaf x -> Leaf x
This fails to compile with:
-- TYPE MISMATCH ----------------------------------------------- src/AltTree.elm Something is off with the 1st branch of this `case` expression: 13| Node (List.map decide subtrees) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This `Node` call produces: Tree (Tree a) But the type annotation on `decide` says it should be: Tree a Hint: Your type annotation uses type variable `a` which means ANY type of value can flow through, but your code is saying it specifically wants a `Tree` value. Maybe change your type annotation to be more specific? Maybe change the code to be more general? Read <https://elm-lang.org/0.19.0/type-annotations> for more advice!
I sort of get why this would happen, but I can’t seem to work around it. Every attempt at defining some sort of
concatTrees : List (Tree a) -> Tree a function to solve the problem has failed with similar error messages.
Any solutions or ideas? Is there something totally misguided in what I’m attempting?