В руководстве пользователя GHC описывается расширение нежизнеспособного полиморфизма со ссылкой на следующий пример:
f :: Maybe (forall a. [a] -> [a]) -> Maybe ([Int], [Char])
f (Just g) = Just (g [3], g "hello")
f Nothing = Nothing
Однако, когда я определяю этот пример в файле и пытаюсь его вызвать, я получаю ошибку типа:
ghci> f (Just reverse)
<interactive>:8:9:
Couldn't match expected type `forall a. [a] -> [a]'
with actual type `[a0] -> [a0]'
In the first argument of `Just', namely `reverse'
In the first argument of `f', namely `(Just reverse)'
In the expression: f (Just reverse)
ghci> f (Just id)
<interactive>:9:9:
Couldn't match expected type `forall a. [a] -> [a]'
with actual type `a0 -> a0'
In the first argument of `Just', namely `id'
In the first argument of `f', namely `(Just id)'
In the expression: f (Just id)
По-видимому, только undefined
, Nothing
или Just undefined
удовлетворяет проверке типов.
У меня есть два вопроса, поэтому:
- Можно ли вызывать вышеуказанную функцию с помощью
Just f
для любого не-нижнегоf
? - Может ли кто-нибудь представить пример значения, определяемого только с помощью недискриминационного полиморфизма и используемого нетривиальным способом?
Последнее особенно связано с страницей HaskellWiki по Импрессивному Полиморфизму, которая в настоящее время делает явно неубедительный случай существования расширения.