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
したがって、2つの質問があります。
Just f
上記の関数は、ボトム以外の関数で呼び出すことができますf
か?- 誰かが、非叙述的なポリモーフィズムでのみ定義可能で、自明ではない方法で使用できる値の例を提供できますか?
後者は特に、非叙述的ポリモーフィズムに関するHaskellWikiページを念頭に置いており、現在、拡張機能の存在について明らかに説得力のない主張をしています。