Opengl 强制内置到其GL等效项

Opengl 强制内置到其GL等效项,opengl,haskell,types,casting,functional-programming,Opengl,Haskell,Types,Casting,Functional Programming,我刚刚在哈斯凯尔写了一篇康威的《生活游戏》,我想我现在应该把它制作成动画 我想使用GLUT+OpenGL,几秒钟后用谷歌搜索,我有了一个例子,准备好了。示例中的不同之处在于,它定义了一个函数,该函数返回一些点作为myPoints::[(GLfloat,GLfloat,GLfloat)],而我将Coord定义为data Coord=Coord{x::Int,y::Int}派生(Show,Eq)。这一切都很好和整洁,游戏似乎在其简单的形式工作,但有问题,当我试图画它。即我应该将点传递给渲染器的部分:

我刚刚在哈斯凯尔写了一篇康威的《生活游戏》,我想我现在应该把它制作成动画

我想使用GLUT+OpenGL,几秒钟后用谷歌搜索,我有了一个例子,准备好了。示例中的不同之处在于,它定义了一个函数,该函数返回一些点作为
myPoints::[(GLfloat,GLfloat,GLfloat)]
,而我将
Coord
定义为
data Coord=Coord{x::Int,y::Int}派生(Show,Eq)
。这一切都很好和整洁,游戏似乎在其简单的形式工作,但有问题,当我试图画它。即我应该将点传递给渲染器的部分:
renderPrimitive Points$mapM\(\(x,y,z)->顶点$Vertex3 x y z)myPoints
如果
myPoints
包含类型为
GLfloat
的值,但
renderPrimitive Points$mapM\(\(坐标x y)->顶点$Vertex2 x y)mycords
抱怨:

No instance for (VertexComponent Int)
  arising from a use of `vertex'
Possible fix: add an instance declaration for (VertexComponent Int)
我尝试了类似于积分x的
和添加一个类型签名
::GLfloat
GLint
的方法,但它似乎总是抱怨它不能接受类型,或者不能进入Int->GLfloat/GLint

我的问题是,如何让我的Coord类型使用OpenGL类型?我在网上找不到任何提示,我也不想做
Coord=Coord{x::GLfloat,y::GLfloat}
,原因很简单,所有其他代码都不能很好地使用GLfloat,因为它们都需要
Num
Int
等等

下面是说明问题的最低场景,我希望能够对其进行编译:

module Main
where

import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT

data Coord = Coord {x :: Int, y :: Int} deriving (Show, Eq)

someCoords = [Coord 1 1, Coord 1 2, Coord 42 7]

main = do
  (progName, _) <- getArgsAndInitialize
  createWindow "Please compile."
  displayCallback $= display
  mainLoop

display = do
  clear [ColorBuffer]
  renderPrimitive Points $ mapM_ (\(Coord x y) -> vertex $ Vertex2 x y) someCoords
主模块
哪里
导入Graphics.Rendering.OpenGL
导入Graphics.UI.GLUT
数据坐标=坐标{x::Int,y::Int}派生(Show,Eq)
someCoords=[Coord11,Coord12,Coord427]
main=do
(progName,)顶点$Vertex2 x y)某些坐标

在与我家的另一位程序员进行了较长时间的搜索之后,我们发现了一段代码,可以让我们从int中生成GLfloat,即
from integral x::GLfloat
将产生所需的结果。类似地,
fromRational
可用于
Float->GLfloat

fromrintegral
可用于整数类型之间的转换,如
Int
Integer
Word
等。
realToFrac
可能是在
Float
之间转换的最优化函数,
Double
GLfloat
等。