Haskell で次のようなデータ型がある場合:
data A ctx = A (forall a. ctx a => a -> a)
次に、特定のクラスの型の値に作用する関数をこのデータ型に入れることができます。
> A (+3) :: A Num
A (+3) :: A Num :: A Num
しかし、複数の制約を持つ関数をこのデータ型に入れることは可能ですか? 私はこれを試しました:
> :t ((+ 3) . succ)
((+ 3) . succ) :: (Enum c, Num c) => c -> c
> :t A ((+ 3) . succ) :: A (Enum,Num)
Expecting one more argument to `Enum'
In an expression type signature: A (Enum, Num)
In the expression: A ((+ 3) . succ) :: A (Enum, Num)
したがって、これは機能しません。どうすればやりたいことができるのか、それとも不可能なのか? 「ダミー」データ型と型ファミリを使用することが 1 つの解決策であることはわかっていますが、複雑なため別の方法がある場合はそうしたくありません。また、この例では succ の代わりに (+1) を使用することもできましたが、1 つのクラスだけに変換できない複雑なケースもあります。