Seguendo il mio domanda ambigua , ecco una domanda che è probabilmente più mirata.
Considera che il seguente frammento di codice forma un programma Haskell:
data NightWatchCommand = InvalidCommand | DownloadCommand { url :: String } | PauseCommand { gid :: String } | UnpauseCommand { gid :: String } | StatusCommand { gid :: String } deriving (Show, Eq)
data AuthNightwatchCommand = AuthNightwatchCommand {
command :: NightWatchCommand,
user :: User
}
Ora, il vincolo aziendale che voglio applicare tramite il sistema dei tipi è questo: dovrebbe non essere possibile per creare un'istanza di NightwatchCommand
non autenticata. E l'unico modo per creare un'istanza di AuthNightwatchCommand
dovrebbe essere tramite una funzione speciale, ad esempio:
fromIncomingMsg :: String -> AuthNightwatchCommand
Solo per fornire un contesto più ampio, l'argomento stringa per questa funzione potrebbe essere:
status <some-id> <auth-token>
Ora, per complicare ulteriormente le cose, fromIncomingMsg
deve convalidare <auth-token>
dal DB. Il che significa che farà IO. Una firma di funzione più appropriata sarebbe:
fromIncomingMsg :: String -> IO (AuthNightwatchCommand)
A parte spingere questo in un modulo e nascondere i costruttori di dati, c'è un altro modo per farlo?