2015-06-12 62 views
0

我正在努力使我的数据类型一般而不是采取在OpenGL类型GLfloat。所以我开始把它做成a,然后用所有东西代替。Haskell - 无法推断...从上下文错误 - OpenGL AsUniform类类型

现在,我已经达到了设置统一变量的地步,但他们采用了GLfloat的。我使用了一个名为GLUtil的库,它使得它更容易一些,它提供了一个类AsUniform来检查类型是否可以是一个统一的变量。我坚持它在我的类型签名,但它仍然给我一个错误。下面的代码:

-- | Sets the modelview and projection matrix uniform variables. 
mvpUnif :: (GL.UniformComponent a, Num a, Epsilon a, Floating a, AsUniform a) => (GLState a) -> ShaderProgram -> IO() 
mvpUnif state p = do 
-- Check if view and projection matrices are there, else set them to the identity. 
let vMat = case vMatrix state of 
    Just v -> v 
    Nothing -> getIdentity 
let pMat = case pMatrix state of 
    Just p -> p 
    Nothing -> getIdentity 
-- Multiply model and view matrix together. 
let mvMatrix = vMat !*! mMatrix state 
setUniform p uModelViewMatrixVar mvMatrix 
setUniform p uProjectionMatrixVar pMat 

和错误:

Could not deduce (AsUniform (V4 (V4 a))) 
    arising from a use of `setUniform' 
from the context (GL.UniformComponent a, 
        Num a, 
        Epsilon a, 
        Floating a, 
        AsUniform a) 
    bound by the type signature for 
      mvpUnif :: (GL.UniformComponent a, Num a, Epsilon a, Floating a 
, 
         AsUniform a) => 
         GLState a -> ShaderProgram -> IO() 
    at src\Graphics\FreeD\Shaders\DefaultShaders.hs:194:12-119 
In a stmt of a 'do' block: 
    setUniform p uModelViewMatrixVar mvMatrix 
In the expression: 
    do { let vMat = ...; 
     let pMat = ...; 
     let mvMatrix = vMat !*! mMatrix state; 
     setUniform p uModelViewMatrixVar mvMatrix; 
     .... } 
In an equation for `mvpUnif': 
    mvpUnif state p 
     = do { let vMat = ...; 
      let pMat = ...; 
      let mvMatrix = ...; 
      .... } 

V4由AsUniform的一个实例,以及M44,这对于(V4(V4一)),其I型想到可能是这个问题,所以我不知道为什么它的行为。

下面是该类的来源:

http://hackage.haskell.org/package/GLUtil-0.8.5/docs/Graphics-GLUtil-Linear.html

谢谢!

回答

1

尝试增加-XFlexibleContexts和约束,从字面上看,你现有的答案:

{-# LANGUAGE FlexibleContexts #-} 

mvpUnif :: (GL.UniformComponent a 
      , Num a 
      , Epsilon a 
      , Floating a 
      , AsUniform a 
      , AsUniform (V4 (V4 a)) 
      ) => (GLState a) -> ShaderProgram -> IO() 

一般情况下是不属于inferrable,或者限制需要被传递地包含在所有调用点约束常规。这种情况一直发生在MonadState等人身上。在这种情况下,setUniform是罪魁祸首。

+0

不可以:/。同样的错误。把它放在顶部和我的cabal文件中,我尝试将sig改为'AsUniform(V4(V4 a))',但这并没有影响到它。也许GLUtil的软件包页面可能会闪耀一些为什么它不起作用的光芒,你认为? – Gentatsu