Drop the Message type definition from the outsourced module, and in that module make labeledContainer polymorphic by replacing all occurrences of Message in its type annotation by a type variable, such as (lowercase) "message".
> Am 29.10.2016 um 13:35 schrieb Vlad GURDIGA <[email protected]>: > > Hey guys! 🤓 > > I’m trying to build an UI widget that would accept a label and a set of > fields and render them as a <fieldset>. Here is how it looks implemented as a > simple Elm function: > > labeledContainer : String -> List (Html Message) -> Html Message > labeledContainer labelText fieldList = > let > label = > legend [] [ text labelText ] > > in > fieldset [] (label :: fieldList) > > and then I use it like this: > > view : Model -> Html Message > view model = > labeledContainer "A person section" > [ personTypeField initialModel.personType > , personTypeSpecificFields initialModel.personType > ] > > This is quite common a pattern, so I wanted to extract it as a module so that > I can reuse it for other widgets. I have tried to just move the > labeledContainer function in its own file, like this: > > module LabeledContainer exposing (..) > > import Html exposing (..) > import Html.Attributes exposing (..) > > > labeledContainer : String -> List (Html Message) -> Html Message > labeledContainer labelText fieldList = > let > label = > legend [] [ text labelText ] > > in > fieldset [] (label :: fieldList) > > > type Message -- ??? This is required as per signature, but I don’t know what > should it be > = None > > and then import it, but the compiler throws this: > > elm-make Main.elm --output=index.html > -- TYPE MISMATCH ----------------------------------------- > ././PersonSection.elm > > The type annotation for `view` does not match its definition. > > 29| view : Model -> Html Message > ^^^^^^^^^^^^^^^^^^^^^ > The type annotation is saying: > > Model -> Html Message > > But I am inferring that the definition has this type: > > Model -> Html LabeledContainer.Message > > -- TYPE MISMATCH ----------------------------------------- > ././PersonSection.elm > > The 2nd argument to function `labeledContainer` is causing a mismatch. > > 31| labeledContainer "A person section" > 32|> [ personTypeField initialModel.personType > 33|> , personTypeSpecificFields initialModel.personType > 34|> ] > > Function `labeledContainer` is expecting the 2nd argument to be: > > List (Html LabeledContainer.Message) > > But it is: > > List (Html Message) > > Hint: I always figure out the type of arguments from left to right. If an > argument is acceptable when I check it, I assume it is "correct" in subsequent > checks. So the problem may actually be in how previous arguments interact with > the 2nd. > > Detected errors in 1 module. > > 🤔 I’m kind of lost and I’m wondering wether this is The Right Approach® to > reuse the labeledContainer function, and if not, any link/advice on how can I > find it would be awesome. 👷 > > Cheers! 🤓 > -- > 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.
