首页 > 解决方案 > 如何在可扩展记录上重复出现?

问题描述

我是 Elm 的相对初学者。我学会了如何重复记录,并创建可扩展的记录。我的目标应用程序具有树形数据,即要在多个树视图中呈现。

为了让 Elm 允许递归模型,需要

到目前为止一切都很好,但我不能将递归与扩展结合起来。下面是我能走多远的最小化版本。该程序能够呈现两种示例类型(文件夹和便笺)中的任何一种,但不能同时呈现两者-- NOTE(见用和注释的行-- FOLDER)。

问题出在kids功能上。Elm 不允许它产生两种不同的输出类型。我要么复制代码,要么不做记录扩展。两者似乎都是表演的终结者。

跑在艾莉身上

module Main exposing (main)
import Html exposing (..)
import Maybe

-- MAIN

main = Html.beginnerProgram
  { model         = init
  , update        = update
  , view          = view
  }

-- MODEL

type alias Model =
  { folder  : Folder
  , note    : Note
  }

type alias Node a =
  { a | name     : String
      , children : Children a
  }

type alias Folder =
  { name     : String
  , children : ChildFolders
  }

type alias Note =
  { name     : String
  , children : ChildNotes
  }

type Children a   = Children a   (Maybe (List (Node a)))
type ChildFolders = ChildFolders (Maybe (List Folder))
type ChildNotes   = ChildNotes   (Maybe (List Note))

-- INIT

init : Model
init = Model
        (Folder "Parent F" someFolders)
        (Note   "Parent N" (ChildNotes Nothing))

someFolders : ChildFolders
someFolders = ChildFolders
  ( Just
    ( [ Folder "Child F1" (ChildFolders Nothing)
      , Folder "Child F2" (ChildFolders Nothing)
      , Folder "Child F3" (ChildFolders Nothing)
      ]
    )
  )

-- UPDATE

type Msg = NoOp

update : Msg -> Model -> Model
update msg model =
  case msg of
    NoOp -> model

-- VIEW

view : Model -> Html msg
view model =
  div []
  [ viewBranch model.folder    -- FOLDER
  -- , viewBranch model.note   -- NOTE
  ]

-- viewBranch : (?) -> Html msg
viewBranch node =
  uli
  ( text node.name
    ::  ( node
          |> kids
          |> List.map viewBranch
        )
  )

uli : List (Html msg) -> Html msg
uli items = ul [] [ li [] items ]

-- kids : (?) -> (?)
kids { children } =
  case children of
    (ChildFolders data) -> Maybe.withDefault [] data      -- FOLDER
    -- (ChildNotes   data) -> Maybe.withDefault [] data   -- NOTE

标签: recursionelm

解决方案


推荐阅读