[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