Haskellの名前空間をまとめる実装
下記のようなコードがありVertex3
のドキュメントを確認しようとおもったのですが、上手くドキュメントが見つけられませんでした。
import Graphics.Rendering.OpenGL as GL GL.vertex $ (GL.Vertex3 (-1) (-1) 0 :: GL.Vertex3 GL.GLfloat)
Graphics.Rendering.OpenGL
のページをみてもVertex3
は存在しません。
しかし、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
にはないためなのでしょうか。ワイルドカードをつかうと曖昧になるので機能としてないみたいです。