功能依赖包装在新类型中

fak*_*ake 7 haskell typeclass functional-dependencies

我想知道为什么下面的代码不能编译以及是否有mkYValGHC 可以接受的实现。

\n
class C x y | x -> y\nnewtype YVal x = YVal { getYVal :: forall y . C x y => y }\nmkYVal :: C x y => y -> YVal x\nmkYVal y = YVal y\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试过

\n
mkYVal :: (y  ~ y1, C x y1) => y -> YVal x\nmkYVal y = YVal y\n
Run Code Online (Sandbox Code Playgroud)\n

但它仍然说

\n
[...]: error:\n  \xe2\x80\xa2 Couldn\'t match type \xe2\x80\x98y2\xe2\x80\x99 with \xe2\x80\x98y1\xe2\x80\x99\n      \xe2\x80\x98y2\xe2\x80\x99 is a rigid type variable bound by\n        a type expected by the context:\n          forall y2. C x y2 => y2\n        at [...]\n      \xe2\x80\x98y1\xe2\x80\x99 is a rigid type variable bound by\n        the type signature for:\n          mkYVal :: forall y y1 x. (y ~ y1, C x y1) => y -> YVal x\n        at [...]\n      Expected type: y2\n        Actual type: y\n    \xe2\x80\xa2 In the first argument of \xe2\x80\x98YVal\xe2\x80\x99, namely \xe2\x80\x98y\xe2\x80\x99\n      In the expression: YVal y\n      In an equation for \xe2\x80\x98mkYVal\xe2\x80\x99: mkYVal y = YVal y\n...\n
Run Code Online (Sandbox Code Playgroud)\n