Skip to content
  • Iustin Pop's avatar
    Generalise the Result type · 93be1ced
    Iustin Pop authored
    
    
    Currently, our error monad—Result—has a plain string error type. This
    is not good, as we don't have structured errors, we can't pass back
    proper error information to Python code, etc.
    
    To solve this, we generalise this type as 'GenericResult a', and make
    Result an alias to 'GenericResult String' for compatibility with the
    old code. New error hierarchies will be introduced as different
    types. Furthermore, we generalise our helper functions too, so that
    they can work on any 'GeneralInstance a' type, not only Result.
    
    There are two small drawbacks to this generalisation. First, a Monad
    instance requires (at least for the way we use it) a 'fail :: String
    -> m a' instance, so we need to be able to build an 'a' value from a
    string; therefore, we can implement the Monad instance only for a
    newly-introduced typeclass, 'FromString', which requires the needed
    conversion function. Second, due to the fact that 'String' is a type
    alias (for [Char]) instead of an actual type, we need to enable the
    FlexibleInstances language pragma; as far as I know, this has no
    significant drawbacks.
    
    Signed-off-by: default avatarIustin Pop <iustin@google.com>
    Reviewed-by: default avatarMichael Hanselmann <hansmi@google.com>
    93be1ced