Home > Mobile >  How to write a polymorphic function with a fixed type in one argument
How to write a polymorphic function with a fixed type in one argument

Time:11-22

I want write a polymorphic function (e.g. mod) with a fixed type in the second argument, the type of the return value is determined by the first argument. Here is my implementation:

f :: Integral a => a -> Int -> a
f n m = mod n m

and it got error:

Couldn't match expected type ‘a’ with actual typeInt
  ‘a’ is a rigid type variable bound by
    the type signature for:
      f :: forall a. Integral a => a -> Int -> a

If I don't want to write two functions with specific type of the first argument (f1 :: Int -> Int -> Int and f2 :: Integer -> Int -> Integer), is there a more elegant implementation?

CodePudding user response:

mod requires both its arguments to be of the same type. So, use fromIntegral to convert m from an Int to type a:

f :: Integral a => a -> Int -> a
f n m = mod n (fromIntegral m)
  • Related