AP
type alias
, это слабый тип (вообще не тип, просто новое имя для существующего типа). Пусть в случае с рекордами это не так важно, потому как разные по составу рекорды считаются разными подтипами, но всё жеSize: a a a
AP
type alias
, это слабый тип (вообще не тип, просто новое имя для существующего типа). Пусть в случае с рекордами это не так важно, потому как разные по составу рекорды считаются разными подтипами, но всё жеST
Model
у меня состоит из трёх главных частей, каждая из которых представлена в виде extensible record'а: LoggedIn { userId : String, ... }
. Эта информация таскается по всем частям приложения, т.к. она необходима везде. Когда это информации нет (например, юзер не залогинен или не зарегистрирован), вместо неё подставляется AnonimousUser
. type alias Model =
AuthData (PageData (UserInputData {}))
type alias AuthData a =
{ a | user : User }
type alias PageData a =
{ a | page : Page }
type alias UserInputData a =
{ a | userInput : UserInput }
Model
из этого типа, состоящего из набора extensible records, в это: type alias Model =
{ user : User
, page : Page
, userInput : UserInput
}
AW
let ... in
)? PageData
является расширением рекорда UserInputData a
, и мне нужно написать функцию, изменяющую только те поля, которые содержатся в рекорде UserInputData a
, то в сигнатуре этой функции я напишу в качестве типа принимаемого значения UserInputData a
(хотя в качестве аргумента буду передавать рекорд PageData
) - и, взглянув на сигнатуру этой функции, я сразу понимаю, что она не затрагивает поля, которыми рекорд PageData
расширяет мой extensible record UserInputData a
. AW
UserContext
?ST
UserContext
?AP
к
AP
AP
WithUserData
, WithInput
как модификаторы для конкретного типаAP
AP
WithA (WithB {})
== WithB (WithA {})
AP
type alias Foo = { foo: () }
type alias Bar = { Foo | bar : () }
AP
AW
UserInputData
:type alias UserInputData a =
{ name : String
, content : String
, tags : List String
}
PageData
и рендерим по этим данным HTML:type alias PageData =
{ name : String
, content : String
, tags : List String
, author : Author
, createdAt : Date
}
UserInputData
, и в рекорде PageData
. И, чтобы не повторяться, мы просто определяем рекорд PageData
как расширение рекорда UserInputData a
, добавив в него лишь специфичные для PageData
поля:type alias PageData =
UserInputData
{ author : Author
, createdAt : Date
}
AP
WithSmth
, тогда будет понятно, что это "миксины" к некоторому типуAP
AW
Вл