Неполная подпись типа

Допустим, у нас есть функция, подобная f ниже, которая возвращает монаду. Однако, где вы видитеIntПритворитесь, что это действительно сложный тип.

f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42

Теперь давайте скажем, что мы хотим заставить это вMaybe монада. Нам не нужно писать полный типf чтобы сделать это, мы можем просто сделать следующее:

g :: Maybe a -> Maybe a
g = id

main = print $ (g f)

Фиктивная функцияg силf становитьсяMaybe.

Я думаю, что вышеупомянутое довольно грязно. Что я лучше напишу, так это:

main = print $ (f :: Maybe a)

Но это терпит неудачу со следующей ошибкой:

Couldn't match expected type `a' against inferred type `Int'
  `a' is a rigid type variable bound by
      the polymorphic type `forall a. Maybe a' at prog.hs:7:16
  Expected type: Maybe a
  Inferred type: Maybe Int
In the second argument of `($)', namely `(f :: Maybe a)'
In the expression: print $ (f :: Maybe a)

Есть ли способ сделать то, чтоg Выше описан менее беспорядочный способ, который не подразумевает создание новой функции? Я не хочу писатьf :: Maybe Int, поскольку это становится проблемой обслуживания, если тип возвращаемого значения изменяется. Расширения GHC в порядке.

Ответы на вопрос(2)

Ваш ответ на вопрос