[Haskell-cafe] Re: [Haskell-beginners] Just how unsafe is unsafe
Colin Paul Adams
colin at colina.demon.co.uk
Fri Feb 6 10:10:11 EST 2009
>>>>> "Roel" == Roel van Dijk <vandijk.roel at gmail.com> writes:
Roel> On Fri, Feb 6, 2009 at 1:00 PM, Antoine Latter <aslatter at gmail.com> wrote:
>> Tangential to all of this - sometimes my unsafeXXX functions
>> are pure, but partial. So I'll have:
>> foo :: a -> b -> Maybe c
>> unsafeFoo :: a -> b -> c
Roel> I use the "unsafe" prefix in the same way. For me it means
Roel> 'assume that preconditions hold'. If the preconditions do
Roel> not hold and you evaluate an unsafe function anyway I would
Roel> expect an error, as opposed to an exception. I have done
Roel> that in my (tiny) roman numerals package.
Roel> -- simplified toRoman :: Int -> Either String Int
Roel> unsafeToRoman :: Int -> String
Roel> The first function is very clear about the fact that
Roel> something can go wrong. If you provide it with a value of
Roel> (-3) it will (hopefully) produce something like 'Left "no
Roel> negative numbers allowed"'. The second function hides this
Roel> fact and will result in a (uncatchable) runtime error. It is
Roel> still a pure function, but preventing errors is now the
Roel> responsibility of whoever evaluates it.
Do you document the preconditions?
It seems to me that this is more useful than naming a function
I was using comments to document the contracts on my functions, but I
have just found about about ESC/Haskell, so I am now using the
contract notation of that (not yet released) tool.
More information about the Haskell-Cafe