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 の出力は次のとおりです。

[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を使用することを提案していますなぜ必要なのですか - DataKinds 拡張機能なしで、同じコードが古い Linux ボックスで正常にコンパイルされますが、新しい環境では動作しないようです。私は現在、主に Portage ライブラリに依存していますが、古い環境は cabal ライブラリに依存していましたが、それが違いを引き起こしているのだろうか? ここで何が問題なのですか?データ型コンストラクターは、インポートされている Graphics.Rendering.OpenGL に存在します - なぜ ghc はここでそれを使用できないのですか?

4

1 に答える 1

3

OpenGL ライブラリ シェーダー API は、バージョン 2.8.0.0 と 2.9.0.0 の間で変更されました。古いバージョンでは、egVertexShaderとに別のタイプを使用していますFragmentShaderが、新しいバージョンでは単純なShaderタイプのみを使用して両方のプログラムを格納しています。

次のいずれかを実行できます

  1. プログラムを更新して新しい API を使用する
  2. OpenGLの古いバージョンをグローバルにインストールしますcabal install OpenGL-2.8.0.0
  3. プロジェクトの .cabal ファイルを作成し (まだ持っていない場合)、依存関係で OpenGL のバージョンを指定します。< 2.9.0.0

cabal ではなく、OS のパッケージ マネージャーからライブラリの依存関係を取得している場合は、オプション 1 にほとんど制限されます。

于 2013-10-17T09:15:29.400 に答える