Определить `псевдоним типа 'с частичным определением или по умолчанию

Есть ли способ высушить это?

Я не хочу повторяться contents : List Nav а также wrapperId : String

type alias InputModel =
    { contents : List Nav
    , containerClassName : Maybe String
    , wrapperId : String
    }


type alias Model =
    { contents : List Nav
    , containerClassName : String
    , wrapperId : String
    }


modelWithDefaults : InputModel -> Model
modelWithDefaults input =
    { input | containerClassName = withDefault "" input.containerClassName }

1 ответ

Решение

Да, есть! Вы можете переместить общие поля в отдельную запись и добавить в нее переменную строки. Переменная строки, a, которые определяют оставшиеся поля, могут быть предоставлены позже:

type alias CommonModel a =
    { a
        | contents : List Nav
        , wrapperId : String
    }


type alias InputModel =
    CommonModel
        { containerClassName : Maybe String }


type alias Model =
    CommonModel
        { containerClassName : String }

Вы также можете использовать переменные строки для написания функций, которые принимают любую запись, если она имеет общие поля. Например

getWrappedId : CommonModel a -> String
getWrapperId { wrapperId } = wrappedId

примет оба InputModel а также Modelили любая другая запись, которая содержит хотя бы поля, указанные CommonModel, Переменная строки будет выведена, как и любая другая переменная типа.

Другие вопросы по тегам