2015-06-12 8 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 = ...; 
      .... } 

В4 изготовлен экземпляр AsUniform, а также М44, который является типом для (В4 (В4 а)), который я мысль может быть проблемой, поэтому я не уверен, почему она действует.

Вот источник для класса:

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

Nope: /. Такая же ошибка. Поместите его вверху и в файл моего кэша, и я попытался изменить сиг на 'AsUniform (V4 (V4 a))', но это не повлияло на него. Возможно, на странице пакета GLUtil может быть немного света, почему это не сработает, вы думаете? – Gentatsu