Haskell:数据/类型构造函数不在范围内,但数据构造函数在范围内

时间:2013-10-17 08:39:48

标签: opengl haskell ghc

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不能在这里使用它?

1 个答案:

答案 0 :(得分:3)

OpenGL库着色器API在版本2.8.0.0和2.9.0.0之间更改。 older version使用单独的类型,例如VertexShaderFragmentShadernew version仅使用简单的Shader类型来存储这两个程序。

你可以

  1. 更新您的程序以使用新API
  2. 使用cabal install OpenGL-2.8.0.0
  3. 全局安装旧版OpenGL
  4. 为您的项目编写.cabal文件(如果您还没有),并将依赖项中的OpenGL版本指定为< 2.9.0.0
  5. 如果您从操作系统的软件包管理器而不是cabal获得库依赖项,那么您几乎只限于选项1.