Итак, библиотека в Haskell называется spoon, которая позволяет мне делать это
safeHead :: [a] -> Maybe a
safeHead = spoon . head
но это также позволяет мне сделать это
>>> 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 just keep waiting...>
который кажется действительно полезным в некоторых случаях, но он также нарушает денотационную семантику (на мой взгляд), поскольку он позволяет мне различать разные вещи в семантическом прообразе ⊥
. Это строго более мощное, чем throw
/catch
, поскольку они, вероятно, имеют семантику, определенную продолжениями.
>>> try $ return (error "thimble") :: IO (Either SomeException Bool)
Right *** Exception: thimble
Итак, мой вопрос: может ли кто-то использовать ложку злонамеренно, чтобы нарушить безопасность типа? Это удобство стоит опасности? Или, что более реалистично, существует ли разумный способ, что использование этого может подорвать доверие к значению программы?