以下は、私がやろうとしていることの簡単な例です...
test :: Bounded a => Maybe a -> a
test (Just x) = x
test Nothing = (maxBound :: a)
maxBound
関数は多態的です - 型クラスのメソッドの 1 つですBounded
。そのため、使用するときは、必要なバージョンを指定する必要がありますBounded
。この単純化された例では、その型はコンテキストから推測できますが、実際の問題では推測できません。実際の問題では明示的な型が必要ですが、ここではそうではありません。
私の関数もポリモーフィックです。具体的な型を直接指定することはできません。型変数のみを指定します。適切な型変数はa
、Bounded a
制約を指定した です。
これをコンパイルすると、次のエラーが発生します...
temp.hs:4:18:
Could not deduce (Bounded a1) arising from a use of `maxBound'
from the context (Bounded a)
bound by the type signature for test :: Bounded a => Maybe a -> a
at temp.hs:2:9-33
Possible fix:
add (Bounded a1) to the context of
an expression type signature: a1
or the type signature for test :: Bounded a => Maybe a -> a
In the expression: (maxBound :: a)
In an equation for `test': test Nothing = (maxBound :: a)
私が知る限り、これはa
inが意図したもの (関数のシグネチャの型変数) とはmaxBound :: a
別のものと見なされたことを意味します。は、GHC が別々と見なす 2 つの変数のあいまいさを解消するために考案した新しい名前です。GHC は、inがここで任意の型を使用できることを示していると見なし (!)、したがって、「任意の型」では十分な制限がないという理由で不平を言います。a
a1
a
a
maxBound :: a
これは、(私が思うに) 最新の Haskell Platform で提供されている GHC バージョン 7.6.3 を使用しています。
以前にも同様の問題がありましたが、常に他の問題が混在していたため、他の問題を修正すると問題はなくなりました。他の問題が原因であるとして却下し、忘れました。ここではそのような贅沢はありません - 上記の最小限の例は実際の問題ではありませんが、まったく同じ問題の解決策に依存しています。
では、なぜ GHC は in を関数全体の型変数から独立したものとして扱っているのa
でしょうかmaxBound :: a
? a
そして、これを修正して正しいバージョンの を選択するにはどうすればよいmaxBound
ですか?