У меня есть несколько типов:
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}
функциях