Haskell:在类型类之间转换

Ser*_*ich 1 haskell

对于这些数据:

data A = A
data B = B

class C1 a where repr :: a -> String
instance C1 A where repr _ = "A"
instance C1 B where repr _ = "B"

class C2 a
instance C2 A
Run Code Online (Sandbox Code Playgroud)

有没有办法用这种类型实现功能?

conv :: (C1 a, C2 b) => a -> Maybe b
Run Code Online (Sandbox Code Playgroud)

它应返回Just . id作为实例的类型的参数C2,以及Nothing任何其他类型的参数.

repr是单射的.我可以更改类C2但是类C1在外部库中.

Dan*_*ner 6

不,这是不可能的.开放世界的假设说,没有办法(在编译时或在运行时)显示给定类型不是给定类的实例.