問題

次のような型定義をどのように読むべきですか?

 type Config data msg =
  Config
    { toId : data -> String
    , toMsg : State -> msg
    , columns : List (ColumnData data msg)
    , customizations : Customizations data msg
    }
 

ConfigはLHSとRHSに存在します。

もう1つの例は次のとおりです。

 type State =
  State String Bool
 

これらの型宣言は何を通信していますか?

  ベストアンサー

左側の名前は、作成するタイプです。右側では、型が実際に取ることができる値を定義します。ただし、必要なものは1つまたは多くあります。

 type MyType = ValueA | ValueB | ValueC
 

さらに、値に余分なデータが含まれている型を作ることができます。これは、値名(正式にはデータコンストラクタ、またはElmのvariant)を別の型でフォローすることによって行うことができます。具体的な型を使用して任意の数を持つことができます。型と特殊性(引数の数)は、バリアント間で同じである必要はありません。

 type MyType = ValueA String | ValueB Int (List String) | ValueC
 

これらはすべて具体的な型です。値がある場合、常に具体的な型があります。独自のペアタイプを作成したいとします。定義することができます

 type PairOfIntAndInt = PairOfIntAndInt Int Int
type PairOfIntAndString = PairOfIntAndString Int String
type PairOfStringAndString = PairOfStringAndString String String
…
 

しかし、それはあまり便利ではありません。そのため、Elmはパラメータを持つ型コンストラクタ(LHSの型名の正式な名前)を持つことができます。それらは小文字で書かれます:

 type Pair first second = Pair first second
 

実際にMaybeResultのような多くの有用なコア機能は、パラメータを受け入れる型です。抽象型とも呼ばれます。それらを具体的な型にするには、それぞれのパラメータに具体的な型[^ 1]を渡す必要があります。

さて、あなたのコードを見てみましょう。 2つのパラメータを取るコンストラクタConfigがあります。

 type Config data msg =
 

型は1つのデータコンストラクタで作成された値を受け入れます

   Config
 

単一の値を格納します。値の型は実際には構成された型、レコードです。 4つのフィールドが必要で、その型は型コンストラクタのパラメータに依存します。

     { toId : data -> String
    , toMsg : State -> msg
    , columns : List (ColumnData data msg)
    , customizations : Customizations data msg
    }
 

たとえば、具体的な型 Config String Int の場合、次の値が必要になります。

 Config
  { toId = someToIdValue
  , toMsg = someToMsgValue
  , columns = someColumnsValue
  , customizations = someCustomizationsValue
}
 

someToIdValueStringをとり、StringtoMsgStateからIntに戻す関数でなければなりません。

詳細は、 https://guide.elm-lang.org/types/custom_types.html を参照してください。

[^ 1]:Haskellのようないくつかの言語は実際にwilder型を許可します。 https://wiki.haskell.org/Kind

  同じタグがついた質問を見る

typessyntaxelm