如何在一个参数中编写具有固定类型的多态函数

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

我想写一个多态函数(例如mod),第二个参数的类型固定,return值的类型由第一个参数决定。 这是我的实现:

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

出现错误:

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

如果我不想用第一个参数的特定类型编写两个函数(f1 :: Int -> Int -> Int 和 f2 :: Integer -> Int -> Integer),是否有更多优雅的实现?

mod 要求它的两个参数是同一类型。因此,使用 fromIntegralmInt 转换为类型 a:

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