Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Passing Ord Function as a Function Parameter

Hello I am learning Haskell at the moment and I was wondering if and how I can pass a function of Eq as a parameter to another function since it works with (+), (-) and (*) (and I know passing functions in general works in haskell). I want to work with the Eq operator in my bar function depending on if the head of my list is smaller, equal or bigger than 0. But the way I did it in my code snippet below I get a compiler error. Sorry if I am missing something obvious here I am pretty new to haskell, your help and explanations are appreciated.

foo :: [x] -> [x]
foo x
  | head x < 0  = bar (<) x
  | head x == 0 = bar (==) x
  | head x > 0  = bar (>) x

bar :: (a -> a -> Bool) -> [x] -> [x]
bar func x = ...

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

You need to add an Ord constraint to bar, since you can’t use values of any type with (<) et al, only those with an Ord instance. You also need to use a throughout the type; using x implies that the type of list passed is independent of the Ord constraint, which would prevent you from using func on an element of the argument x.

 bar :: Ord a => (a -> a -> Bool) -> [a] -> [a]
 bar func x = ...

Since Eq is a superclass of Ord, you don’t need to specify Eq explicitly; an instance of Ord implies an instance of Eq.

You need the constraint on foo as well, since you use <, ==, and > in the guards, not just as arguments to bar. To emphasize exhaustivity, try using compare instead of three separate guards

foo :: Ord a => [a] -> [a]
foo x = let f = case compare (head x) 0 of
                  LT -> (<)
                  EQ -> (==)
                  GT -> (>)
        in bar f x

(And consider what, if anything, needs to be done about an empty list argument to foo.)

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading