fak*_*ake 7 haskell typeclass functional-dependencies
我想知道为什么下面的代码不能编译以及是否有mkYValGHC 可以接受的实现。
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\nRun Code Online (Sandbox Code Playgroud)\n我也尝试过
\nmkYVal :: (y ~ y1, C x y1) => y -> YVal x\nmkYVal y = YVal y\nRun 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...\nRun Code Online (Sandbox Code Playgroud)\n