ИМО чистое решение лежит в @ wintvelt первый suggestion: table [] ([ myHeader ] ++ List.map ...)
. Для новых пользователей вяза, это кажется наиболее интуитивным. (BTW, я новый пользователь.)
По существу, здесь реализация выноса заключается в том, что компилятор вяза не группирует table [] [] ++ []
как table [] ([] ++ [])
(например). Вместо этого, вяза группируют его как (table [] []) ++ []
. Это имеет смысл, если вы думаете об этом.
Таким образом, оценка elm table [] [] ++ []
производит, во-первых, что-то типа Html msg
(in Elm 0.18). После этого функция ++
перестает работать, когда она пытается объединить этот Html msg
с List
.
(Естественно, также, если вы попытаетесь добавить в неправильном пути некоторые из ваших Html
атрибутов, а List
кодирования table [] ++ [] []
, вы получите подобное сообщение об ошибке.)
Вот конкретизированы решение , протестирована с elm-make 0.18 (elm Platform 0.18.0)
:
module Main exposing (main)
import Html exposing (..)
main : Program Never Model Msg
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ messages : List String }
init : (Model, Cmd Msg)
init =
(Model [], Cmd.none)
-- UPDATE
type Msg
= None
update : Msg -> Model -> (Model, Cmd Msg)
update msg { messages } =
case msg of
None ->
(Model messages, Cmd.none)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[]
-- VIEW
type alias MyListItem =
{ label : String
, price : Float
}
total : Float
total =
5.0
myList : List MyListItem
myList =
[ { label = "labelA", price = 2 }
, { label = "labelB", price = 3 }
]
toTableRow : MyListItem -> Html Msg
toTableRow myListItem =
tr []
[ td [] [ text myListItem.label ]
, td [] [ text (toString myListItem.price) ]
]
view : Model -> Html Msg
view model =
table
[]
([ thead []
[ th [] [ text "Product" ]
, th [] [ text "Amount" ]
]
]
++ List.map toTableRow myList
++ [ tr
[]
[ td [] [ text "Total" ]
, td [] [ text (toString total) ]
]
]
)
Или вы можете использовать '::' оператор вместо '' -> '[THEAD [] []] :: List.map' – farmio
@farmio да, то есть другой жизнеспособный вариант – marcosh
Просто обратите внимание: если вы используете '::' или аналогичные, вы должны использовать круглые скобки вокруг общего li st, иначе elm перестанет оценивать после первого ребенка/подсписок. Итак, что-то вроде 'table [] ([myHeader] ++ List.map ...)' или 'table [] (myHeader :: List.map ...)' – wintvelt