Thanks Peter! You are right: I simply forgot to add model as argument to my 
radio function.

For whom it may interest, this is my revised version that works as required 
- with little minor improvments:

- I replaced the clear checkbox by a button and changed the Model and Msg 
type and the update function accordingly.
- I renamed the radio function to checkbox which it actually represents.



import Html exposing (..)
import Html.App exposing (beginnerProgram)
import Html.Attributes exposing (..)
import Html.Events exposing (onCheck,onClick)


main =
  beginnerProgram { model = model, view = view, update = update }



-- MODEL


type alias Model =
  { red : Bool
  , underline : Bool
  , bold : Bool
  }


model : Model
model =
  Model False False False



-- UPDATE


type Msg
  = Red Bool
  | Underline Bool
  | Bold Bool
  | Clear


update : Msg -> Model -> Model
update msg model =
  case msg of
    Red bool ->
        { model | red = bool }

    Underline bool ->
        { model | underline = bool }

    Bold bool ->
        { model | bold = bool }
    Clear ->
        Model False False False


-- VIEW


view : Model -> Html Msg
view model =
  div []
    [ span [toStyle model] [text "Hello, how are you?!"]
    , div [] [text (toString model)]
    , checkbox model "bold"
    , checkbox model "underline"
    , checkbox model "red"
    , label []
        [ br [] []
        , button [ onClick Clear ] [ text "clear" ]
        ]
    ]


checkbox : Model -> String -> Html Msg
checkbox model str =
  let (event,model') =
    case str of
      "red" -> (Red,model.red)
      "underline" -> (Underline,model.underline)
      "bold" -> (Bold,model.bold)
      _ -> (Red,model.red)
  in
    label []
      [ br [] []
      , input [ type' "checkbox", checked model', onCheck event ] []
      , text str
      ]

toStyle : Model -> Attribute msg
toStyle model =
  style
    [ ("color", if model.red then "red" else "black")
    , ("text-decoration", if model.underline then "underline" else "none")
    , ("font-weight", if model.bold then "bold" else "normal")
    ]





Am Mittwoch, 22. Juni 2016 21:26:24 UTC+2 schrieb Peter Damoc:
>
> You should have gotten a compiler error in your radio code but you somehow 
> ended up with the wrong thing. :) 
>
> The model in the radio is not the current model of your running up but it 
> is the initial model which is also called "model".
>
> So, make sure your radio buttons receive the current value of the the 
> model. ;) 
>
>  
>  
>
>
>
> On Wed, Jun 22, 2016 at 10:02 PM, Immanuel Normann <[email protected] 
> <javascript:>> wrote:
>
>> Hi,
>>
>> as a former enthusiastic Haskell programmer I got excited about Elm and 
>> eventually started today to learn Elm by examples (
>> http://elm-lang.org/examples).
>>
>> My first exercise was about checkboxes: 
>> http://elm-lang.org/examples/checkboxes
>>
>> There at the very bottom an exercise is proposed:
>>
>>> -- Exercise: move the repetative code in `view` into a separate function
>>> -- and use it three times.
>>>
>>
>> I introduced a function named "radio" for this purpose and it works (code 
>> below).
>>
>> Then I was thinking about extending the exercise a bit: I want a fourth 
>> radio button named "clear" that sets the model of the three other buttons 
>> to False if clear is True. So I extended the types *Model* and *Msg* 
>> appropriately. And this works as well. However, I failed in the 
>> implementation of the last natural requirement: when I check the clear 
>> button all the other buttons should be unchecked.
>>
>> How can I achieve this?
>>
>> This is my compiling but incomplete attempt:
>>
>> import Html exposing (..)
>> import Html.App exposing (beginnerProgram)
>> import Html.Attributes exposing (..)
>> import Html.Events exposing (onCheck)
>>
>>
>> main =
>>   beginnerProgram { model = model, view = view, update = update }
>>
>>
>>
>> -- MODEL
>>
>>
>> type alias Model =
>>   { red : Bool
>>   , underline : Bool
>>   , bold : Bool
>>   , clear : Bool
>>   }
>>
>>
>> model : Model
>> model =
>>   Model False False False True
>>
>>
>>
>> -- UPDATE
>>
>>
>> type Msg
>>   = Red Bool
>>   | Underline Bool
>>   | Bold Bool
>>   | Clear Bool
>>
>>
>> update : Msg -> Model -> Model
>> update msg model =
>>   case msg of
>>     Red bool ->
>>         { model | red = bool }
>>
>>     Underline bool ->
>>         { model | underline = bool }
>>
>>     Bold bool ->
>>         { model | bold = bool }
>>     Clear bool ->
>>         Model False False False bool
>>
>>
>> -- VIEW
>>
>>
>> view : Model -> Html Msg
>> view model =
>>   div []
>>     [ span [toStyle model] [text "Hello, how are you?!"]
>>     , div [] [text (toString model)]
>>     , radio "bold"
>>     , radio "underline"
>>     , radio "red"
>>     , radio "clear"
>>     ]
>>
>>
>> radio : String -> Html Msg
>> radio str =
>>   let (event,model') =
>>     case str of
>>       "red" -> (Red,model.red)
>>       "underline" -> (Underline,model.underline)
>>       "bold" -> (Bold,model.bold)
>>       _ -> (Clear,model.clear)
>>   in
>>     label []
>>       [ br [] []
>>       , input [ type' "checkbox", checked model', onCheck event ] []
>>       , text str
>>       ]
>>
>> toStyle : Model -> Attribute msg
>> toStyle model =
>>   style
>>     [ ("color", if model.red then "red" else "black")
>>     , ("text-decoration", if model.underline then "underline" else "none")
>>     , ("font-weight", if model.bold then "bold" else "normal")
>>     ]
>>
>>
>> -- Exercise: move the repetative code in `view` into a separate function
>> -- and use it three times.
>>
>> Somehow in my radio function the checked attribute must be updated on any 
>> Msg. I stuck here. Probably a boring exercise for an experienced elm 
>> programmer, but not so for beginners.
>> So any help is appriciated! 
>>
>> Cheers,
>> Immanuel
>>
>>
>>
>>
>> -- 
>> 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.
>>
>
>
>
> -- 
> There is NO FATE, we are the creators.
> blog: http://damoc.ro/
>

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