背景:
我一直在使用gloss 库进行一些简单的图表工作。但是当需要一些更具交互性的东西时,我发现我想要一个更强大的库。在做了一些研究之后,我决定我喜欢 SDL 库的功能,并想尝试为它安装 Haskell 绑定。到这一步我已经失败了。
第1部分:
如何安装和配置 SDL 二进制文件,以便 Haskell 绑定可以使用它们?
第2部分:
Hackage 上众多且记录不完整的 SDL 包中的哪一个是当前社区中的首选绑定?如何让该软件包正确安装?
第 3 部分:(可选)
如果 SDL 不适合 Haskell 开发,那么首选的替代方案是什么?
我有这两个功能:
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')
这是有道理的,我没有给一个具体类型和两个load和send多态.不知何故,编译器必须决定使用哪个版本send(以及扩展名为什么版本toJSON).
我可以在运行时确定具体类型a是什么.这些信息实际上是在磁盘上的数据和Reference类型中编码的,但我不确定在编译时是否正在运行类型检查器.
有没有办法在运行时传递正确的类型仍然保持类型检查器快乐?
附加信息
参考文献的定义
data Reference = Ref {
assetType:: String
, assetIndex :: Int …Run Code Online (Sandbox Code Playgroud) 我有一个功能 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中,我们有一个函数(==) :: 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是否与我回来的相同 - …
我试图从列表中取出一对的第一个和第二个元素,以便可以对其求和。这是我的代码,我不确定为什么会出错
func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)
Run Code Online (Sandbox Code Playgroud)