Help for this page
A basic technique is to use newtype declarations to declare separate
types for separate intents.
append (AnnotatedString x) (AnnotatedString y)
= AnnotatedString (x ++ y)
If x and y have the same safety level,
then (x ++ y) has again that same safety level.
type family Join a b
type instance Join Safe Safe = Safe
type instance Join Safe Unsafe = Unsafe
type instance Join Unsafe Safe = Unsafe
type instance Join Unsafe Unsafe = Unsafe
:: AnnotatedString a
-> AnnotatedString b
-> AnnotatedString (Join a b)
(x ++ y) is at least as safe as the least safe of x and y.
I make decisions, and my brain carries them out
My brain makes the decisions, and I observe them (if I'm lucky)
I make some decisions, and my brain makes others
My spouse makes decisions and I and my brain carry them out
I wrote a program to relieve me and my brain from the burden of decision-making
The black-helicopter people project the decisions into my brain and then I do as ordered
Results (389 votes),