2017-11-06 2 views
3

を一覧表示し、一つの解決策は、型シグネチャをもたらす:カウント要素は<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の結果を返さずにそのようなソリューションを生成する方法が不明です。

答えて

2

コメント用の特殊な折り畳み機能が必要なようです。フォールディングとは、要素とある種のアキュムレータ値を受け入れる関数を持つ構造内のすべての要素を訪問し、ある状態を段階的に保持できるという考え方です。

サイドノート:私は本当に同じものを表すResponsesの代わりに、空のリストからMaybe ResponsesNothingとしてあなたはコメントresponsesを定義することをお勧めします。あなたはこのようなコメントの一覧については、foldlを定義することができ

foldl : (Comment -> b -> b) -> b -> List Comment -> b 
foldl f = 
    List.foldl 
     (\c acc -> 
      case c.responses of 
       Responses responses -> 
        foldl f (f c acc) responses 
     ) 

それは最初にあなたの関数でコメントノードを訪問することを意味し、すべての子どもたちが一緒に結果を蓄積し、左から右へ方法。

長さを決定するためにそれを使用するには、単にコメントを無視して、道に沿ってカウンタをインクリメント:

length : List Comment 
length = 
    foldl (\_ acc -> acc + 1) 0 

あなたはdefinition of List.lengthは、その実施のためのfoldlの同じ考えを使用していることがわかります。

+0

パーフェクト、説明のおかげで。あなたのサイドノートも多くの意味がありますので、再度洞察力に感謝します。 – Geodesic

関連する問題

 関連する問題