2017-12-22 14 views
1

カウントアップ/ダウンタイマーをモデリングしています。原点日が設定された後、タイマーはどれくらいの時間が経過したか、またはその起点日まで残っているかどうかを表示します。ネストされたユニオンタイプのパターンマッチング

type OriginDefined 
    = Up Date 
    | Down Date 


type Origin 
    = OriginDefined 
    | OriginUndefined 


type Model 
    = Tick OriginDefined 
    | Edit Origin 

したがって、タイマーは、起点日が定義されている場合にのみ有効です。しかし、原点が編集されている場合は、事前に定義されている場合と定義されていない場合があります。

Editモードでは、日付入力にdefaultValueを返す関数が必要です。

dateInputDefaultValue : Origin -> String 
dateInputDefaultValue origin = 
    case origin of 
     OriginUndefined -> 
      "" 

     OriginDefined -> 
      ... 

は、ここで私はUp dateまたはDown dateとしてoriginさらにdestructureに苦労します。 case式の2番目のブランチでは、コンパイラはoriginを、Originよりも具体的なものとして扱うことを拒否します。ここで

は、私はそのようなモデルを扱う必要がありますどのようにエリーhttps://ellie-app.com/3zKCcX87wa1/0

ですか?私は別の方法でモデル化すべきですか?

答えて

5

あなたのタイプはコンパイルしますが、OriginDefinedの二つの異なる定義を持っている:一つは、2つのコンストラクタ、UpDownを持ってOriginDefinedと呼ばれるタイプです。もう1つは、タイプがOriginのパラメータのないコンストラクタです。

OriginDefinedコンストラクタでOriginOriginDefinedの値を指定しようとしていました。あなたはOriginDefinedコンストラクタでタイプOriginDefinedのパラメータを定義しなければならない、それを行うために:

type Origin 
    = OriginDefined OriginDefined 
    | OriginUndefined 

今、あなたは、エルムのMaybeタイプと同型であるタイプを持っているので、おそらくそれはあまり混乱するでしょうOriginDefinedタイプを削除し、これをOriginの定義を交換すると、より多くの慣用:

type Origin 
    = Up Date 
    | Down Date 

今、あなたはあなたが事前に定義された/ undefiを使用していた場所でMaybeを使用することができますNED命名法:

type Model 
    = Tick (Maybe Origin) 
    | Edit Origin 

次のようになりますMaybe Originに一致するパターン:

dateInputDefaultValue : Maybe Origin -> String 
dateInputDefaultValue origin = 
    case origin of 
     Nothing -> 
      "" 

     Just (Up date) -> 
      "…" 

     Just (Down date) -> 
      "…" 
関連する問題