[Haskell-cafe] seems like I'm on the wrong track
Casey Hawthorne
caseyh at istar.ca
Tue Dec 1 20:22:56 EST 2009
Please check out Paul Hudak's page.
http://cs-www.cs.yale.edu/homes/hudak-paul/
On Tue, 01 Dec 2009 17:01:29 -0800, you wrote:
>Perhaps someone could either (1) help me do what I'm trying to do, or (2) show
>me a better way.
>
>I have a problem that is very state-ful and I keep thinking of it as OO, which
>is driving me crazy. Haskell is several times harder to use than Python in this
>instance, probably because I'm doing it wrong.
>
>To give you a larger context, this problem is essentially compiling a
>description of music (my own) into a kind of music-machine-language (CSound).
>CSound is relatively untidy.
>
>In this one example, in a OO way of thinking, I have data called AssignedNumbers
>that assigns integers to unique strings and keeps track of the used integers and
>next available integer (the choice of available integer could follow a number of
>conventions so I wanted to hide that in an ADT.) So it has an associated function:
>
>getNumber :: String -> AssignedNumbers -> (Int,AssignedNumbers)
>
>What getNumber does is:
>
> - check if the string already has a number assigned to it. If so, return that
>number.
>
> - if not, pick the next available number.
>
> - in all cases, return the possibly changed state of AssignedNumbers
>
>Then in a larger data structure, it contains fields of type AssignedNumbers. Like
>
>data MusicStuff = MusicStuff
> { oscillatorNumbers :: AssignedNumbers
> , tableNumbers :: AssignedNumbers
> , ... }
>
>I'm using MusicStuff in a State monad, so I might write a function like
>
>doSomeMusicStuff :: String -> String -> State MusicStuff (Int,Int)
>doSomeMusicStuff aString1 aString2 = do
> ms <- get
> (o1,newOscNums) = getNumber aString1 (oscillatorNumbers ms)
> (t1,newTabNums) = getNumber aString2 (tableNumbers ms)
> put ms { oscillatorNumbers = newOscNums
> , tableNumbers = newTabNums }
> return (o1,t1)
>
>For what it does, this is extremely verbose and filled with distracting visual
>content. And this is just a very simple example---my real problem is several
>times more state-ful. Is there a better way?
>
>Note that in Python it would be a method
>
>def doMusicStuff( self, s1, s2 ) :
> return (self.oscillatorNumbers.next(s1), self.oscillatorNumbers.next(s2))
>
>
>
>
>
>
>_______________________________________________
>Haskell-Cafe mailing list
>Haskell-Cafe at haskell.org
>http://www.haskell.org/mailman/listinfo/haskell-cafe
--
Regards,
Casey
More information about the Haskell-Cafe
mailing list