[Haskell-cafe] Different return type?

Daniel Fischer daniel.is.fischer at web.de
Sun Jan 18 21:13:44 EST 2009


Am Montag, 19. Januar 2009 02:44 schrieb John Ky:
> Hi,
>
> Possibly a silly question but is it possible to have a function that has a
> different return type based on it's first argument?
>
> For instance
>
> data Person = Person { name :: String, ... }
> data Business = Business { business_number :: Int, ...}
>
> key person = name person
> key business = business_number business
>
> Thanks
>
> -John

Well, you could use

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, 
TypeSynonymInstances #-}
module Key where

data Person = Person { name :: String }
data Business = Business { business_number :: Int}

class Key a b | a -> b where
    key :: a -> b

instance Key Person String where
    key = name

instance Key Business Int where
    key = business_number

or with type families:
{-# LANGUAGE TypeFamilies #-}
class Key2 a where
    type Res a
    key2 :: a -> Res a

instance Key2 Person where
    type Res Person = String
    key2 = name

instance Key2 Business where
    type Res Business = Int
    key2 = business_number


but apart from that and parametrically polymorphic functions (of type a -> [a] 
or the like), I don't think it's possible, it would need dependent types.

HTH,
Daniel


More information about the Haskell-Cafe mailing list