Niepełny podpis typu

Powiedzmy, że mamy funkcję f poniżej, która zwraca monadę. Jednak gdzie widziszInt, udawaj, że to naprawdę skomplikowany typ.

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

Teraz powiedzmy, że chcemy wprowadzić to w życieMaybe monad. Nie musimy pisać pełnego typuf aby to zrobić, możemy po prostu wykonać następujące czynności:

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

main = print $ (g f)

Funkcja fikcyjnag siłyf zostaćMaybe.

Myślę, że powyższe jest dość niechlujne. To, co wolałbym napisać, to:

main = print $ (f :: Maybe a)

Ale nie powiedzie się z następującym błędem:

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)

Czy istnieje sposób, aby zrobić cog powyżej robi to w mniej brudny sposób, który nie wymaga tworzenia nowej funkcji? Nie chcę pisaćf :: Maybe Int, ponieważ staje się to problemem konserwacyjnym, jeśli zmieni się typ powrotu. Rozszerzenia GHC są w porządku w odpowiedziach.

questionAnswers(2)

yourAnswerToTheQuestion