Quindi c'è una biblioteca in Haskell chiamato spoon che mi permette di fare questoIl cucchiaio non è sicuro in Haskell?
safeHead :: [a] -> Maybe a
safeHead = spoon . head
ma permette anche a fare questo
>>> spoon True :: Maybe Bool
Just True
>>> spoon (error "fork") :: Maybe Bool
Nothing
>>> spoon undefined :: Maybe Bool
Nothing
>>> spoon (let x = x in x) :: Maybe Bool
<... let's just keep waiting...>
che sembra davvero utile in alcuni casi, ma viola anche la semantica denotazionale (a mio parere) poiché mi permette di distinguere tra cose diverse nella preimage semantico di ⊥
. Questo è strettamente più potente di throw
/catch
poiché probabilmente hanno una semantica definita da continuazioni.
>>> try $ return (error "thimble") :: IO (Either SomeException Bool)
Right *** Exception: thimble
Quindi la mia domanda è: qualcuno può usare cucchiaio maliziosamente a rompere la sicurezza di tipo? La convenienza vale il pericolo? O, più realisticamente, c'è un modo ragionevole per usarlo potrebbe erodere la fiducia di qualcuno nel significato di un programma?
Di quale pericolo parli? Che un purista potrebbe rincasare per l'orrore? –
buona domanda, sembra che questo potrebbe essere davvero utile. –
@RobertHarvey Potrebbe non esserci alcun pericolo, ma spesso si scopre che le violazioni della purezza portano a aspettative errate sul comportamento o trucchi per aggirare l'incapsulamento del modulo.Sarei più che felice di usare 'spoon' in codice reale (lo faccio già) ma ho notato oggi che viola la semantica di Haskell. –