Подмножество вязов - PullRequest
2 голосов
/ 26 июня 2019

Скажем, у меня есть такой тип объединения:

type Route
  = Home
  | License
  | UserProfile { username : String }
  | Search { query : String }
  | SomeOtherPage

На практике мне часто приходится работать с подмножествами этого объединения.Например:

type StaticRoute = Home | License

Я хотел бы иметь возможность определять функции, которые принимают подмножества, как указано выше, вместо более широких Route.

Я не хочу вкладывать StaticRoute внутри Route, вот так:

type Route
  = Static StaticRoute
  | UserProfile { username : String }
  | Search { query : String }
  | SomeOtherPage

Это потому, что я хочу иметь возможность определять множество различных подмножеств Route, некоторые из которых могут перекрываться:

type StaticRoute = Home | License
type RouteWithServerRendering = Home | Search { query : String }
type LoggedInRoute = SomeOtherPage
-- and so on…

Как тогда я могу определить подмножества Route без повторения определений?

1 Ответ

6 голосов
/ 26 июня 2019

Джаспер Вауденберг недавно опубликовано Функции преобразования, пять звезд , который выступает за наличие похожих типов и использование функций преобразования для перевода между одним типом в другой.

В вашем случае это может выглядеть так:

module Route exposing (fromStaticRoute, toStaticRoute)

fromStaticRoute : StaticRoute -> Route
fromStaticRoute staticRoute =
    case staticRoute of
        Static.Home ->
            Home
        Static.License ->
            License

toStaticRoute : Route -> Maybe StaticRoute
toStaticRoute route =
    case route of
        Home ->
            Just Static.Home
        License ->
            Just Static.License
        _ ->
            Nothing
...