[Haskell-beginners] strict evaluation and MIDI playback
Heinrich Apfelmus
apfelmus at quantentunnel.de
Fri Nov 6 22:22:46 UTC 2015
Dear Dennis,
note that the `evaluate` function only evaluates to weak head normal
form (WHNF). A list may be in WHNF even when the head and tail are
unevaluated expressions. What you want is to evaluate the list of notes
to normal form (NF).
The `Control.DeepSeq` module collects functions related to obtaining
normal forms. In your case, changing the line to
midiEvents <- evaluate $ force $ computeMidiEvents music
will probably do the trick, but you may need to implement an instance
NFData for your `MidiEvent` type.
For more details on NF, WHNF and lazy evaluation in general, see also [1].
[1]: https://hackhands.com/lazy-evaluation-works-haskell/
Best regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
Dennis Raddle wrote:
> I wrote a program in Haskell that does real-time MIDI playback. This
> involves computing what are called MIDI "events" (things like notes and
> volume controls) and then using the PortMidi library to play back the
> events. PortMidi also provides a time reading function that is accurate to
> 1 millisecond which is useful for timing the playback accurately.
>
> I used 'evaluate' in the IO Monad to make sure that all events were fully
> computed before playback started. However I was still getting delays
> (timing errors). I added some code to the program that wrote the data to
> disk before playing it back, and the timing errors went away. Apparently
> 'evaluate' was not forcing a complete evaluation, while writing a disk file
> was. Or at least I think that's what happened.
>
> But writing to disk is a hack. What can I do to get 'evaluate' to work?
>
> A simplified version of the code is here: (the actual program is pretty
> long and complex so I posted something which is stripped down but I hope
> retains the essential features)
>
> http://lpaste.net/144762
>
>
More information about the Beginners
mailing list