小编Joh*_*ler的帖子

在 Windows 上为 Haskell (GHC) 安装 SDL

背景:

我一直在使用gloss 库进行一些简单的图表工作。但是当需要一些更具交互性的东西时,我发现我想要一个更强大的库。在做了一些研究之后,我决定我喜欢 SDL 库的功能,并想尝试为它安装 Haskell 绑定。到这一步我已经失败了。

第1部分:

如何安装和配置 SDL 二进制文件,以便 Haskell 绑定可以使用它们?

第2部分:

Hackage 上众多且记录不完整的 SDL 包中的哪一个是当前社区中的首选绑定?如何让该软件包正确安装?

第 3 部分:(可选)

如果 SDL 不适合 Haskell 开发,那么首选的替代方案是什么?

haskell sdl cabal

2
推荐指数
1
解决办法
1666
查看次数

解决模糊类型变量

我有这两个功能:

load :: Asset a => Reference -> IO (Maybe  a)
send :: Asset a => a -> IO ()
Run Code Online (Sandbox Code Playgroud)

Asset类看起来像这样:

class (Typeable a,ToJSON a, FromJSON a) => Asset a where
  ref :: a -> Reference
  ...
Run Code Online (Sandbox Code Playgroud)

第一个从磁盘读取资产,第二个将JSON表示传输到WebSocket.孤立地,它们工作正常,但是当我将它们组合起来时,编译器无法推断出具体类型a应该是什么.(Could not deduce (Asset a0) arising from a use of 'load')

这是有道理的,我没有给一个具体类型和两个loadsend多态.不知何故,编译器必须决定使用哪个版本send(以及扩展名为什么版本toJSON).

我可以在运行时确定具体类型a是什么.这些信息实际上是在磁盘上的数据和Reference类型中编码的,但我不确定在编译时是否正在运行类型检查器.

有没有办法在运行时传递正确的类型仍然保持类型检查器快乐?


附加信息

参考文献的定义

data Reference = Ref {
    assetType:: String
  , assetIndex :: Int …
Run Code Online (Sandbox Code Playgroud)

haskell parametric-polymorphism

2
推荐指数
2
解决办法
206
查看次数

($)是(.)as`fmap`是?

我有一个功能 funcM :: a -> b -> c -> IO (x, y)

我想编写一个函数funcM_ :: a-> b-> c-> IO x:

funcM_ = fst `fmap` funcM -- error
Run Code Online (Sandbox Code Playgroud)

我可以添加所有的点,但似乎应该有一些我可以替换的东西fmap,以便上述工作.有点像用(.)替换($)会使这个工作在纯粹的上下文中.

我在寻找什么功能?

haskell functor pointfree

1
推荐指数
1
解决办法
340
查看次数

Haskell函数检查两个值是否相同

在Haskell中,我们有一个函数(==) :: Eq a => a->a->Bool,它适用于Eq可以定义实例的大量数据类型.但是,有些类型没有合理的方法来定义实例Eq.一个例子是简单的函数类型(a->b)

我正在寻找一个函数,告诉我两个值是否实际相同 - 不相等但相同.

例如f(id,id)==> True f((+),(-))= False

澄清:

并不想知道如果两个函数做同样的事情.在一般情况下,这是不可能的.我想知道我是否已经回到了与我开始时相同的事情.让我举一个精简的例子:

data Foo = Foo (Foo->Foo)  --contains a function so no Eq instance

x :: Foo
x = Foo id -- or for that matter Foo undefined

y :: Foo
y = Foo (const x)

a :: Foo
a = let (Foo fy) = y
     in fy x
Run Code Online (Sandbox Code Playgroud)

很明显,通过检查一旦评估,a将是x.但是我们假设我不知道y中的函数但我想测试我放入的Foo是否与我回来的相同 - …

haskell

1
推荐指数
1
解决办法
1053
查看次数

您如何对列表中一对的各个元素求和?

我试图从列表中取出一对的第一个和第二个元素,以便可以对其求和。这是我的代码,我不确定为什么会出错

func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)
Run Code Online (Sandbox Code Playgroud)

haskell pattern-matching

0
推荐指数
1
解决办法
106
查看次数