を一覧表示し、一つの解決策は、型シグネチャをもたらす:カウント要素は<a href="https://github.com/elm-lang/elm-compiler/blob/0.18.0/hints/recursive-alias.md" rel="nofollow noreferrer">elm-compiler</a>リポジトリ内の再帰型エイリアスヒントから作業
type alias Comment =
{ message : String
, upvotes : Int
, downvotes : Int
, responses : Maybe Responses
}
type Responses = Responses (List Comment)
(responses
を可能にするためにここにMaybe Responses
を入力するように拡張された場合空のレスポンスリスト)。
私の現在の解決策は必要以上に複雑であるように見えますが、そのようなリストの要素の数を数えることに興味があります。
count : List Comment -> Int
count comments =
let
responses =
List.concatMap (\c -> flatList c) comments
in
List.length responses
flatList : Comment -> List Comment
flatList root =
let
rest =
case root.children of
Just responseList ->
List.concatMap (\child -> flatList child) <| unwrapResponses responseList
Nothing ->
[]
in
root :: rest
unwrapResponses : Responses -> List Comment
unwrapResponses responses =
case responses of
Responses comments ->
comments
事実上、これは各Responses
サブリストをアンラップし、再帰的に平坦化します。次に、親のそれぞれについてComments
フラットResponses
のリストを連結し、最後にこのリストの長さを取得します。
私はこの平坦化されたリストを使用していないので、私はリスト内で繰り返されるように各List.length
を数え、次に結果を折りたたんだり合計したりする)。しかし、私はflatList
の結果を返さずにそのようなソリューションを生成する方法が不明です。
パーフェクト、説明のおかげで。あなたのサイドノートも多くの意味がありますので、再度洞察力に感謝します。 – Geodesic