Картографирование Maybes с настройками по умолчанию - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в Elm и fp в общем, поэтому я пытаюсь понять это

Я пытаюсь декодировать Json, который может иметь 2 дополнительных файла "имя пользователя" и "пароль" среди других

Я успешно расшифровал структуру в следующий тип

type alias Req = 
    { ...
    , username : Maybe String
    , password: Maybe String
    }

Также у меня есть другие типы

type alias BA = 
     { username : String
     , password : String
     }

type alias sBA = Maybe BA

Теперь я хотел бы иметь функцию getsBa, чтобы я мог сделать следующее

getsBA : Req -> sBA
...

a : Req
a = { ...
     , username = Just "test"
     , password = Nothing
     }

getsBA a == Just { username = "test", password = "" }

b = { ...
     , username = Nothing
     , password = Nothing
     }
 getsBA b = Nothing

c : Req
c = { ...
     , username = Nothing
     , password = Just "123"
     }

getsBA a == Just { username = "", password = "123" }


d : Req
d = { ...
     , username = Just "test"
     , password = Just "123"
     }

getsBA a == Just { username = "test", password = "123" }

Как я могу думать о таком решении с точки зрения FP?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вот альтернатива ответу @ duggi, который использует Maybe.withDefault для уменьшения повторения в коде:

getsBA : Req -> SBA
getsBA { username, password } =
    case ( username, password ) of
        ( Nothing, Nothing ) ->
            Nothing

        _ ->
            Just <| BA (Maybe.withDefault "" username) (Maybe.withDefault "" password)
0 голосов
/ 26 апреля 2018
type alias Creds = (Maybe String, Maybe String)
f :: Req -> Creds
f r = (r.username, r.password)

g :: Creds -> sBA
g c = 
  case c of
    (Nothing, Nothing) -> Nothing
    (Nothing, Just p) -> Just {username = "", password = p}
    (Just u, Nothing) -> Just {username = u, password = ""}
    (Just u, Just p) -> Just {username = u, password = p}

getsBA = g << f

f - это экстрактор полей, g манипулирует этими значениями, а getsBA - это композиция этих двух (извлекает поля и затем манипулирует ими). ​​

...