Runner in the High

技術のことをかくこころみ

Elmで再帰構造を使って特定の順序でなければ状態を更新できない型を作る

a, b, c, dという型がある状況でaがなければbが更新できないし、bがなければcが更新できない、のような流れを再帰構造の型で表現する実装。使いどころは謎だが思いついたのでメモしておく。

type Data a b c d =
    Data (Maybe (a, Maybe (b, Maybe (c, Maybe d))))


type alias Payload = 
    Data Int Float String Bool


init : Payload
init =
    Data Nothing


mapA : Payload -> Int -> Payload
mapA (Data data) value =
    case data of
        Nothing ->
            Data (Just (value, Nothing))
        
        _ ->
            Data data
           
           
mapB : Payload -> Float -> Payload
mapB (Data data) value =
    case data of
        (Just (a, Nothing)) ->
            Data (Just (a, Just (value, Nothing)))
           
        _ ->
            Data data
            

mapC : Payload -> String -> Payload
mapC (Data data) value =
    case data of
        (Just (a, Just (b, Nothing))) ->
            Data (Just (a, Just (b, Just (value, Nothing))))
           
        _ ->
            Data data


mapD : Payload -> Bool -> Payload
mapD (Data data) value =
    case data of
        (Just (a, Just (b, Just (c, Nothing)))) ->
            Data (Just (a, Just (b, Just (c, Just value))))
           
        _ ->
            Data data
           

hasAll : Payload -> Bool
hasAll (Data data) =
    case data of
        (Just (_, Just (_, Just (_, Just _)))) ->
            True
            
        _ ->
            False

もし再帰構造にせずデータを全部Maybeで横持ちにすると、cやdのデータだけが存在している状況を作れてしまう。だが、この構造であればそのような状態は作れない。