IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Haskellの名前空間をまとめる実装

下記のようなコードがありVertex3のドキュメントを確認しようとおもったのですが、上手くドキュメントが見つけられませんでした。

import Graphics.Rendering.OpenGL as GL

GL.vertex $ (GL.Vertex3 (-1) (-1)  0 :: GL.Vertex3 GL.GLfloat)

Graphics.Rendering.OpenGLのページをみてもVertex3は存在しません。

Graphics.Rendering.OpenGL

しかし、ghciにて確認すると、Graphics.Rendering.OpenGLに存在するようにみえます。

*Main> :i Graphics.Rendering.OpenGL.Vertex3
data Vertex3 a = Vertex3 !a !a !a
    -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Bounded a => Bounded (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Eq a => Eq (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Functor Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Ord a => Ord (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Read a => Read (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Show a => Show (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Applicative Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Foldable Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Traversable Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance TrimmingPoint Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GLU.NURBS’
instance VertexAttribComponent a => VertexAttrib (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.VertexSpec’
instance VertexComponent a => Vertex (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.VertexSpec’
instance UniformComponent a => Uniform (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Shaders.Uniform’
instance WindowPosComponent a => WindowPos (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.RasterPos’
instance RasterPosComponent a => RasterPos (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.RasterPos’
instance ControlPoint Vertex3
  -- Defined in ‘OpenGL-3.0.1.0:Graphics.Rendering.OpenGL.GL.ControlPoint’
*Main> 

よく読むと、-- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’とあるので、実際はTensorパッケージに存在しているようです。ghciで確認すると、確かにあるようです。

*Main> :i Graphics.Rendering.OpenGL.GL.Tensor.Vertex3
data Vertex3 a = Vertex3 !a !a !a
    -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Bounded a => Bounded (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Eq a => Eq (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Functor Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Ord a => Ord (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Read a => Read (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Show a => Show (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Applicative Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Foldable Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance [safe] Traversable Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Tensor’
instance TrimmingPoint Vertex3
  -- Defined in ‘Graphics.Rendering.OpenGL.GLU.NURBS’
instance VertexAttribComponent a => VertexAttrib (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.VertexSpec’
instance VertexComponent a => Vertex (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.VertexSpec’
instance UniformComponent a => Uniform (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.Shaders.Uniform’
instance WindowPosComponent a => WindowPos (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.RasterPos’
instance RasterPosComponent a => RasterPos (Vertex3 a)
  -- Defined in ‘Graphics.Rendering.OpenGL.GL.RasterPos’
instance ControlPoint Vertex3
  -- Defined in ‘OpenGL-3.0.1.0:Graphics.Rendering.OpenGL.GL.ControlPoint’
*Main> 

不思議に思いソースコードを確認したところ、名前空間をまとめているようです。

https://github.com/haskell-opengl/OpenGL/blob/master/src/Graphics/Rendering/OpenGL.hs

module Graphics.Rendering.OpenGL (
 ...
     module Graphics.Rendering.OpenGL.GL
   , module Graphics.Rendering.OpenGL.GLU
 ...
) where

https://github.com/haskell-opengl/OpenGL/blob/master/src/Graphics/Rendering/OpenGL/GL.hs

module Graphics.Rendering.OpenGL.GL (
 ...
   module Graphics.Rendering.OpenGL.GL.Tensor,
 ...
) where

https://github.com/haskell-opengl/OpenGL/blob/master/src/Graphics/Rendering/OpenGL/GL/Tensor.hs

module Graphics.Rendering.OpenGL.GL.Tensor (
   Vertex1(..), Vertex2(..), Vertex3(..), Vertex4(..),
   Vector1(..), Vector2(..), Vector3(..), Vector4(..)
) where

Javaでいうimport foo.bar.*のようなワイルドカードを使ってインポートする機能がhaskellにはないためなのでしょうか。ワイルドカードをつかうと曖昧になるので機能としてないみたいです。

stackoverflow.com