
In my app, I am trying to save a whole bunch of code duplication by leverage the fact that functions can be passed in to other functions as arguments. However, I run into a kink when I try to use functions from type classes, and then apply those functions to different types of arguments after the functions have been passed in. My actual code is rather long and somewhat complicated, so I will use this simpler example: Obviously both the following functions work fine: code: -------- g :: (Integer, Double) g = ((+) 1 2, (+) 2.0 3.0) g' :: (Integer, Double) g' = ((-) 1 2, (-) 2.0 3.0) *Main> g (3,5.0) *Main> g' (-1,-1.0) -------- However, what if I want to create a single function, where I just pass in the (+) or the (-) function? I not sure the right way to do that, exactly, but I tried something like this: code: -------- gCore :: Num a => (a -> a -> a) -> (Integer, Double) gCore f = (f 1 2, f 2.0 3.0) -------- The resulting error is: code: -------- Couldn't match type `Double' with `Integer' In the return type of a call of `f' In the expression: f 1 2 In the expression: (f 1 2, f 2.0 3.0) -------- It is as though the function "forgot" that it could be used on different types, and just picked one, and now is complaining that is being used with the wrong type in the other case. -- frigidcode.com indicium.us