2016-09-13 5 views
0

私は奇妙な状況を把握できません。地図上に多分(リストa)を使用するにはどうすればよいですか?

type alias Schedule = 
    { name : String 
    , display : String 
    , interval : Maybe Int 
    , events : Maybe (List Event) 
    } 


type alias Event = 
    { schedule : Maybe String 
    , interval : Maybe Int 
    , hook : String 
    , args : List (String, String) 
    , timestamp : Int 
    , seconds_due : Int 
    } 

setScheduledEventDueNow : Event -> Schedule -> Schedule 
setScheduledEventDueNow event schedule = 
    case schedule.events of 
     Just events -> 
      { schedule | events = List.map (setMatchedEventDueNow event) events } 

     Nothing -> 
      schedule 

ありまたはScheduleEventsListであってもなくてもよいので、それはevents : Maybe (List Event)として設定されています。

既知のアクションに応答して、Eventがある場合は、スケジュール上のイベントを実行し、そのイベントの最新のリストを返す可能性があります。

しかし、私は次のエラーを取得しています:私は本当にイベントのリストは、すべてがそれをマッピングするために良いことがありますことを、case文であったことが確認されていたので

-- TYPE MISMATCH ----------------------------------------- src/elm/CronPixie.elm 

The 1st and 2nd branches of this `case` produce different types of values. 

373|  case schedule.events of 
374|   Just events -> 
375|    { schedule | events = List.map (setMatchedEventDueNow event) events } 
376| 
377|   Nothing -> 
378|>   schedule 

The 1st branch has this type: 

    { a | events : List Event } 

But the 2nd is: 

    { a | events : Maybe (List Event) } 

Hint: All branches in a `case` must have the same type. So no matter which one 
we take, we always get back the same type of value. 

Detected errors in 1 module. 

私の初心者の脳は思いました。

しかし、コンパイラは、それが単純なものだと認識しています。List.mapの可能性はありません。したがって、当然、caseの2つのブランチによって返されるものの違いについては不平を言います。

どのようにすればいいですか?

答えて

2

あなたは根本的にMaybe.map、イベントのリストがすでにNothingある場合Nothingを返す、とマップを使用することにより、より簡潔にするだけ

Just events -> 
    { schedule | events = Just <| List.map (setMatchedEventDueNow event) events } 

あなたは全体の機能を書くことができます使用して、リストをラップする必要がありますそうでない場合は、指定された関数を使用してリストします。

setScheduledEventDueNow : Event -> Schedule -> Schedule 
setScheduledEventDueNow event schedule = 
    { schedule | events = Maybe.map (List.map <| setMatchedEventDueNow event) schedule.events } 
+2

これは動作します。より根本的な問題は、この場合に 'Maybe(List a)'型が本当に必要かどうかです。あなたのスケジュールにイベントがない場合(つまり、あなたのリストに何もない場合)、空のリスト '[]'はあなたの目的に役立ちませんか?あなたのイベントは 'Maybe.map'と' case'ステートメントを大幅に節約する 'List Event'の型になります。私は、リスト以外のものには 'Maybe'タイプしか必要ないことがわかりました。 'Maybe Int'、' Maybe Date'のようになります。ここで 'Nothing'は変数が空であることを意味します。 – wintvelt

+2

それはあなたのビジネス要件に依存しますが、ほとんどの場合、それはちょうどいいと思います。空のリストがあなたのニーズに合ったときには不必要になる –

+0

残念ながら、特定の状況下で 'スケジュール'に 'events'セクションを含まないかもしれないPHPバックエンドからのデータがあります。代わりに空リストを追加するといいでしょう。それは悪い考えではありません。私はまた 'スケジュール'のために 'Dict'を使うことを考えました、私は将来何かを調査するかもしれません。 – ianmjones

関連する問題