[Haskell-cafe] multi parameter type classes for NP problems

Joshua Ball sciolizer at gmail.com
Wed Dec 20 12:34:11 EST 2006

Hi all,

For my own study, I've been playing around with various NP complete
problems. Previuosly I was doing so in Java, but because I want to
learn Haskell, I'm trying to port the algorithms. In Java, I had an
abstract class called AbstractNPProblem which looked like this:

public abstract class AbstractNPProblem implements NPProblem {
    public abstract boolean validates(Certificate c);
    public abstract List<Certificate> certificates();
    public boolean decide() {
        for (Certificate c : certificates()) {
            if (validates(c)) {
                return true;
        return false;

This has one problem, however: it is slightly dynamically typed.
Anybody that implements the verify method must cast the object c to a
particular type (could be a bitmask, a list of integers, a subgraph,
etc.) I'd like to get rid of this problem in porting to Haskell. Here
is how I am trying to solve the problem, using multi-parameter type

class NPProblem inst cert where
    validates :: cert -> inst -> Bool
    certificates :: inst -> [cert]
    decide :: inst -> Bool
    decide i = any (\x -> x `validates` i) $ certificates i

Unfortunately, ghc throws the following type error:

    Could not deduce (NPProblem inst a)
      from the context (NPProblem inst cert)
      arising from use of `certificates' at NPProblem.hs:5:45-58
    Possible fix:
      add (NPProblem inst a) to the class or instance method `decide'
    In the second argument of `($)', namely `certificates i'
    In the expression:
          (any (\ x -> x `validates` i)) $ (certificates i)
    In the definition of `decide':
        decide i = (any (\ x -> x `validates` i)) $ (certificates i)

Could somebody explain what is wrong with my intuitive approach? Also,
is multi parameter type classes the way to go, or is there a better

More information about the Haskell-Cafe mailing list