Если вы не хотите использовать ScopedTypeVariables, вы можете использовать функцию good ole fashion asTypeOf
.
-- defined in Prelude
asTypeOf :: a -> a -> a
x `asTypeOf` y = x
blah :: a -> b -> a
blah x y = ble x where
ble x = x `asTypeOf` y
Конечно, это не скомпилируется из-за ошибки типа.
Обновление:
Я хотел бы отметить, что иногда вам, возможно, придется быть немного хитрым, чтобы делать то, что вы хотите с asTypeOf
. Возьмите следующий пример, который излишне использует asTypeOf
, потому что я не хочу думать о случае, который действительно нуждается в asTypeOf
. Подобные решения будут работать одинаково для реальных случаев.
foo :: Bounded a => Maybe a -> a
foo m = x
where
x = maxBound -- Q: how do I make (x :: a) when given (Maybe a)?
_ = Just x `asTypeof` m -- A: witchcraft!