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输出:
[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 :(得分:3)
OpenGL库着色器API在版本2.8.0.0和2.9.0.0之间更改。 older version使用单独的类型,例如VertexShader
和FragmentShader
但new version仅使用简单的Shader
类型来存储这两个程序。
你可以
cabal install OpenGL-2.8.0.0
< 2.9.0.0
如果您从操作系统的软件包管理器而不是cabal获得库依赖项,那么您几乎只限于选项1.