Il existe donc une bibliothèque en Haskell appelée cuillère ce qui me permet de faire ceci
safeHead :: [a] -> Maybe a
safeHead = spoon . head
mais il me permet aussi de faire ceci
>>> 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...>
ce qui semble très utile dans certains cas, mais qui viole également la sémantique dénotationnelle (à mon sens) puisqu'elle me permet de distinguer différentes choses dans la pré-image sémantique de . C'est strictement plus puissant que throw
/ catch
puisqu'ils ont probablement une sémantique définie par les continuations.
>>> try $ return (error "thimble") :: IO (Either SomeException Bool)
Right *** Exception: thimble
Ma question est donc la suivante : quelqu'un peut-il utiliser spoon de manière malveillante pour enfreindre la sécurité des caractères ? Le confort d'utilisation vaut-il le danger ? Ou, de manière plus réaliste, existe-t-il un moyen raisonnable d'éroder la confiance de quelqu'un dans la signification d'un programme ?