2013-10-17 30 views
2
module Main where 

import   Graphics.Rendering.OpenGL 

data Shaders = Shaders { vertexShader :: VertexShader 
        , fragmentShader :: FragmentShader 
        , program'  :: Program 
        , positionA  :: AttribLocation } 

data Resources = Resources { vertexBuffer :: BufferObject 
         , elementBuffer :: BufferObject 
         , shaders  :: Shaders 
         , fadeFactor :: GLfloat } 


main :: IO() 
main = do 
    putStrLn "test" 

這裏的ghci的輸出:Haskell中:數據/類型構造器在範圍上,而是一個數據構造是在範圍

[1 of 1] Compiling Main    (/home/madjestic/Projects/Haskell/OpenGL/triangle_02/Main_test.hs, interpreted) 

/home/madjestic/Projects/Haskell/OpenGL/triangle_02/Main_test.hs:11:45: 
    Not in scope: type constructor or class `VertexShader' 
    A data constructor of that name is in scope; did you mean -XDataKinds? 

/home/madjestic/Projects/Haskell/OpenGL/triangle_02/Main_test.hs:12:45: 
    Not in scope: type constructor or class `FragmentShader' 
    A data constructor of that name is in scope; did you mean -XDataKinds? 
Failed, modules loaded: none. 

錯誤狀態,即類型或類的構造不在範圍內,但同時它說「這個名稱的數據構造函數在範圍內......」,但建議使用DataKinds,我不明白爲什麼我需要它 - 在我的舊版Linux上編譯相同的代碼盒,沒有DataKinds擴展名,但它似乎不適用於新環境。我現在主要依賴portage庫,而舊環境更依賴cabal庫,我想知道這是否會導致差異?這裏有什麼問題?數據類型構造函數存在於正在導入的Graphics.Rendering.OpenGL中 - ghc如何在這裏不能使用它?

+0

檢查你使用的庫的版本。這兩個系統之間可能會有一些API變化。 – Satvik

回答

3

OpenGL庫着色器API在版本2.8.0.0和2.9.0.0之間更改。 older version使用不同的類型用於例如VertexShaderFragmentShader,但new version只使用簡單的Shader類型來存儲這兩個程序。

您可以

  1. 更新程序中使用新的API
  2. 全球與cabal install OpenGL-2.8.0.0
  3. 寫.cabal文件爲您的項目安裝的OpenGL的舊版本(如果你不這樣做已經有一個),並指定OpenGL版本的依賴關係爲< 2.9.0.0

如果您從操作系統的pac中獲得庫依賴項kage manager而不是cabal,那麼你幾乎只限於選項1.