Неполная подпись типа
Допустим, у нас есть функция, подобная 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 в порядке.