[Haskell-beginners] Re: data constructors
Heinrich Apfelmus
apfelmus at quantentunnel.de
Mon Apr 20 03:01:01 EDT 2009
Michael Mossey wrote:
> I want to write a function that converts the first way of organizing the
> information into the second. I tried writing types like
>
> type Chord = ...
> type Time = Double
> type Name = String
>
> type TimedChord = (Time,Chord)
> type Staff = [(Time,Chord)]
> type NamedStaff = (Name,Staff)
> type NamedChord = (Name,Chord)
> type Vertical = [NamedChord]
> type TimedVertical = (Time,Vertical)
>
> The function I want is
>
> convert :: [NamedStaff] -> [TimedVertical]
>
> As you can imagine, this is a confusing mess, with all these variants on
> named and timed things. I thought it might help to create functors
> called Named and Timed, which might help abstracting operations on named
> and timed things. For example,
>
> datatype Named a = Named { namedName :: Name, namedData :: a }
>
> instance Functor Named =
> name a :: Name
> name a = namedName a
> x `fmap` f = Named { namedName = namedName x, namedData = f $
> namedData x }
>
> Any other suggestions?
Functors sounds good to me.
data Named a = N Name a
data Timed a = T Time a
instance Functor Named where ...
instance Functor Timed where ...
convert :: Named [Timed Chord] -> Timed [Named Chord]
But you can also use plain type synonyms
type Named a = (Name,a)
type Timed a = (Time,a)
and write your own record selectors by hand
name :: Named a -> Name
name = fst
time :: Timed a -> Time
time = fst
value :: (b,a) -> a
value = snd
Regards,
apfelmus
--
http://apfelmus.nfshost.com
More information about the Beginners
mailing list