Получить конструктор по значению в Elm (0.19.1) - PullRequest
1 голос
/ 17 апреля 2020

У меня есть несколько типов:

type alias Type1 = { name : String }
type alias Type2 = { name : String, age : Int }
type S
  = S1 Type1
  | S2 Type2

Итак, когда я хочу построить свою информацию, я могу сделать следующее:

a = S1 { name = "Name1" }
b = S2 { name = "Name2", age = 100 }

Теперь я хотел бы получить его конструктор (S1 или S2) на основе информации, передаваемой в качестве параметра функции constructorByData. Примеры:

constructorByData a -- It should be returned `S1`
constructorByData b -- It should be returned `S2`

Это мой подход:

constructorByData : S -> (a -> S)
constructorByData s =
  case s of
    S1 _ -> S1
    S2 _ -> S2

Обратите внимание, что приведенный выше код не работает. Я получаю следующую ошибку:

-- TYPE MISMATCH ---------------------------------------------------------- REPL

Something is off with the 2nd branch of this `case` expression:

14|       S2 _ -> S2
                  ^^
This `S2` value is a:

    Type2 -> S

But the type annotation on `constructorByData` says it should be:

    a -> S

-- TYPE MISMATCH ---------------------------------------------------------- REPL

Something is off with the 1st branch of this `case` expression:

13|       S1 _ -> S1
                  ^^
This `S1` value is a:

    Type1 -> S

But the type annotation on `constructorByData` says it should be:

    a -> S

Основная причина, по которой я хочу это сделать, заключается в том, что я хочу сделать следующее, обобщив сообщение:

type Field
  = Name
  | Age

type Msg
  = UpdateFieldString S Field String
  | UpdateFieldInt S Field Int

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
  case msg of
    UpdateFieldString s field value -> updateFieldString model s field value
    UpdateFieldInt s field value -> updateFieldInt model s field value

И для этого мне нужен конструктор в updateField{String, Int} функциях

...