recursion - 如何在可扩展记录上重复出现?
问题描述
我是 Elm 的相对初学者。我学会了如何重复记录,并创建可扩展的记录。我的目标应用程序具有树形数据,即要在多个树视图中呈现。
为了让 Elm 允许递归模型,需要
- 子字段的联合类型,
- a Maybe 在该类型定义中,并且
- 如果需要 Json 解码,则使用惰性匿名函数构造。
到目前为止一切都很好,但我不能将递归与扩展结合起来。下面是我能走多远的最小化版本。该程序能够呈现两种示例类型(文件夹和便笺)中的任何一种,但不能同时呈现两者。-- NOTE
(见用和注释的行-- FOLDER
)。
问题出在kids
功能上。Elm 不允许它产生两种不同的输出类型。我要么复制代码,要么不做记录扩展。两者似乎都是表演的终结者。
- 有没有办法让它同时使用extension 和 recursion并且没有代码重复?
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
解决方案
推荐阅读
- python - 将碎片化的 MP4 转换为 MP4
- c - 如何将复制整数值长度后跟包含该值的字节字符串的 C 代码转换为任意字节?
- swift - 如何在云函数中初始化 ParseObject?
- node.js - crypto.getCiphers() - 为什么通过 NodeJS (v12.18.3) 与 ElectronJS 通过 (NodeJS 12.14.1) 提供一组不同的算法?
- jenkins - Jenkinsfile 并行阶段 - 一个说在运行时暂停
- vue.js - 如何在 nuxt axios instanse 中添加令牌
- python - 如何使用日期作为过滤器将列添加到数据框中
- docker - 如何通过“docker logs”获取嵌入在 docker 容器中的 VM 的控制台日志
- scala - 如何解决编译时的类型错误:Any to T?
- mysql - MySQL 根据存储过程中传递的 id 添加新的 LIST 分区?