我有一个大型的Haskell项目,其中包含许多使用堆栈构建的包.当我在核心模型或某些配置数据中进行微小的更改而不更改任何类型时,我有很长的重新编译时间.
如果这是C,我只需重新编译更改的目标文件,然后重新链接整个项目.在Haskell中,我必须重新编译每个依赖于已更改模块的模块.
我知道这可以实现各种编译器优化,但我正在寻找一种方法来回避这一点,以便在开发过程中快速重新编译.在Haskell有什么办法可以做到这一点吗?
我过去(分别)使用过 SDL 和 glut,没有太大问题,现在我想在项目中使用 SDL/opengl。当我调用第一个 openGl 函数时,无论我尝试使用哪个 openGl 函数,都会出现段错误。
我尝试运行我在网上找到的 5 个不同的示例程序。我尝试了sdl 网站上的这个 SDLgears 示例,仅对源代码进行了很小的更改 (SDL_GetKeyState --> SDL_GetKeyboardState),但它也失败了。这让我觉得我的库可能有问题?
这是我的相关 macports 库:
libsdl-devel @1.3.0-5552_0 (active)
libsdl_mixer @1.2.11_3 (active)
mesa @7.8.2_2 (active)
Run Code Online (Sandbox Code Playgroud)
虽然我不清楚 -lGL 是台面还是系统库。
我尝试过的所有示例都可以归结为:
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
void
warn_if_fail(int sdl_ret)
{
if (sdl_ret < 0)
printf("opengl error: %s\n", SDL_GetError());
}
int main(int argc __attribute__((unused)), char* args[] __attribute__((unused)))
{
// init sdl video
SDL_Init(SDL_INIT_VIDEO);
//print video info
const SDL_VideoInfo* info = SDL_GetVideoInfo();
printf("video card memory: %d\n", info->video_mem);
printf("current_w: …Run Code Online (Sandbox Code Playgroud) 我试着阅读这篇论文(http://www.ittc.ku.edu/csdl/fpg/sites/default/files/Gill-09-TypeSafeReification.pdf)并设法重新启用我的符号表达式类型,但我可以'弄清楚如何重新列出它们的清单.这是简化的代码:
{-# OPTIONS_GHC -Wall #-}
{-# Language TypeOperators #-}
{-# Language TypeFamilies #-}
{-# Language FlexibleInstances #-}
import Control.Applicative
import Data.Reify
-- symbolic expression type
data Expr a = EConst a
| EBin (Expr a) (Expr a)
deriving Show
-- corresponding node type
data GraphExpr a b = GConst a
| GBin b b
deriving Show
instance MuRef (Expr a) where
type DeRef (Expr a) = GraphExpr a
mapDeRef _ (EConst c) = pure (GConst c)
mapDeRef f …Run Code Online (Sandbox Code Playgroud) 是否有可能创建一个函数,在编译时从模板haskell引号外部重写haskell代码?
例如:
differentiate :: Floating a => (a -> a) -> a -> (a,a)
differentiate = -- what goes here?
f :: Num a => a -> a
f = sin
g :: Num a => a -> (a,a)
g = differentiate f
Run Code Online (Sandbox Code Playgroud)
在编译时它会将g转换为:
g x = (sin x, cos x)
Run Code Online (Sandbox Code Playgroud)
我希望我的"区分"函数能够传递给"f"的AST并让我在编译之前重写它.据我所知,你不能在模板haskell中做到这一点,而不传递函数的完整语法,即"g =区分罪".
谢谢
我知道您可以在关联的类型系列和数据系列上添加约束.这样做是对所有类的实例强制执行约束.
但我无法弄清楚如何在实例派生或函数声明中推断出这些约束.例如,此代码无法键入check:
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Proxy ( Proxy )
class Eq (FooT a) => Foo a where
type FooT a :: *
-- Can't infer it in an instance derivation
data CantInferEq a = CantInferEq (FooT a) deriving Eq
-- Also can't infer it in a function declaration.
-- The Proxy is there to avoid non-injectivity issues.
cantInferEq :: Proxy a -> FooT a -> FooT a -> …Run Code Online (Sandbox Code Playgroud)