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のデータだけが存在している状況を作れてしまう。だが、この構造であればそのような状態は作れない。