Elm Tagged Union Type比较构造函数

Xyk*_*ing 8 elm union-types

是否可以用来==比较Elm中标记的联合类型的构造函数,或者你是否必须使用大小写?

例:

  type alias Model =
    { accessToken : String
    , page : Page
    , config : Config 
    } 

  type Page 
    = Home String
    | Profile String


   menu : Model -> Html Msg
   menu model = 
      div []
          [ a [ href "#home", classList [ ("active", model.page == Home) ] ][ text "Home" ]
          , a [ href "#profile", classList [ ("active", model.page == Profile)] ][ text "Profile" ]        
          ]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想写一些像model.page == Home来检查当前页面是否为Home,以便我可以在该链接上将css类设置为"active",但似乎我必须使用我可以做的一个案例,但对于这种情况实施起来有点尴尬.

Cha*_*ert 8

不,您不能==用来检查用于创建标记联合值的构造函数.我们通常这样做的方式是通过一些辅助函数:

isHome : Page -> Bool
isHome pg =
    case pg of
        Home _ -> True
        _ -> False

isProfile : Page -> Bool
isProfile pg =
    case pg of
        Profile _ -> True
        _ -> False
Run Code Online (Sandbox Code Playgroud)

这在调用时会导致同样可读的代码:

menu : Model -> Html Msg
menu model =
    div []
        [ a [ href "#home", classList [ ( "active", isHome model.page ) ] ] [ text "Home" ]
        , a [ href "#profile", classList [ ( "active", isProfile model.page ) ] ] [ text "Profile" ]
        ]
Run Code Online (Sandbox Code Playgroud)