
I'm trying to write a combinatorial search algorithm with evaluation, and kind of stuck. Not sure how to do this. I'm constructing a musical phrase, which is a list of MidiPitch: [MidiPitch] I have an evaluation function that determines the fitness of any given phrase: eval :: [MidiPitch] -> Maybe Float This returns Nothing if the phrase is completely unacceptable. The idea is to build up a phrase one midi pitch at a time, choosing all possible next pitches (notes) from a range: next pitch comes from: [10..90] Most of the pitches will result in a phrase that evaluates to Nothing, so the combinatoral "explosion" will be limited. I'd like to write a function that constructs a phrase of length n, and in fact will have to return a list of all phrases that have equal scores of the maximum. -- <length of output phrase> -> <first pitch> -> <eval func> -> -- <all tied phrases of best score> coolFunc :: Int -> MidiPitch -> ([MidiPitch] -> Maybe Float) -> [[MidiPitch]] I am stuck on how to write this. thanks, Mike