小编Gar*_*ock的帖子

如何使用GHCJS从Javascript调用Haskell

我一直在玩GHCJS.FFI可用于从Haskell调用javascript,但我无法弄清楚如何反过来.假设我在Haskell中编写了一个非常实用的实用函数:

sayHello :: String -> IO ()
sayHello name = print $ "hello, " ++ name
Run Code Online (Sandbox Code Playgroud)

有可能做一些事情,所以我可以从Javascript调用它吗?我最接近的是注意到h$main(h$main2CMainzimain)会触发我的Haskell主函数.

haskell ghcjs

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

在*Ubuntu上安装gloss(特别是OpenGLRaw依赖项)时,"*缺少C库:GL"

尝试安装光泽时出现以下错误:

Configuring OpenGLRaw-1.5.0.1...
Failed to install OpenGLRaw-1.5.0.1
Build log ( /home/<homdir>/.cabal/logs/OpenGLRaw-1.5.0.1.log ):
Configuring OpenGLRaw-1.5.0.1...
setup-Simple-Cabal-1.18.1.5-x86_64-linux-ghc-7.8.4: Missing dependency on a
foreign library:
* Missing C library: GL
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the library is
already installed but in a non-standard location then you can use the flags
Run Code Online (Sandbox Code Playgroud)

通常我会尝试libgl-dev根据通常的命名约定进行安装,但是没有这样的库.

opengl haskell openglraw gloss

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

如何在gtk2hs中的事件处理程序之间传递状态

我正在尝试制作玩具应用程序,以便了解如何在Haskell中编写事件驱动程序.我要做的是在画布上绘制一条线,每次按下一个键时向前移动(所以它在文本编辑器中是一种原始光标).

我的问题是我无法确定用户按下按键的次数的最佳方法.显然,我不能像在命令式程序中那样使用全局变量,所以我可能需要在调用堆栈上传递状态,但是在每个事件处理程序返回后,GTK执行会进入主循环,因为我不会控制主循环我不知道如何从一个事件处理程序传递更改的全局状态.那么一个事件处理程序如何将状态传递给另一个事件处理程序?

我在这里有一种部分解决方案,其中键盘事件重新调整myDraw,并将其设置为新的事件处理程序.我不确定这个解决方案是否可以扩展,或者即使这是一个好主意.

什么是这个问题的最佳粒子解决方案?

import Graphics.UI.Gtk
import Graphics.Rendering.Cairo

main :: IO ()
main= do
     initGUI
     window <- windowNew
     set window [windowTitle := "Hello World",
                 windowDefaultWidth := 300, windowDefaultHeight := 200]

     canvas <- drawingAreaNew
     containerAdd window canvas

     widgetShowAll window 
     draWin <- widgetGetDrawWindow canvas
     canvas `on` exposeEvent $ do liftIO $ renderWithDrawable draWin (myDraw 10)
                                  return False

     window `on` keyPressEvent $ onKeyboard canvas
     window `on` destroyEvent  $ do liftIO mainQuit
                                    return False

     mainGUI

onKeyboard :: DrawingArea -> EventM EKey Bool
onKeyboard canvas …
Run Code Online (Sandbox Code Playgroud)

haskell gtk2hs

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

如何根据另一个准引用者编写一个准引用者

例如,如果我正在与第三方准引用者合作,thirdParty :: QuasiQuoter并且我想根据该准引用者编写自己的内容,我该怎么做?在 ghci 我尝试过

runQ [| [thirdParty| |] |]
Run Code Online (Sandbox Code Playgroud)

但这输出(就我而言):

LamE [VarP _render_2] (AppE (VarE GHC.Base.return) (ConE GHC.Tuple.()))
Run Code Online (Sandbox Code Playgroud)

这并没有告诉我“[thirdParty | |]”的抽象语法树是什么,所以我似乎无法使用模板Haskell构建这样的模式。

haskell template-haskell

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

如何用管道检测输入结束

我正在尝试从一个管道中读取一组最多50个项目,并在一次IO操作中处理它们.(这个用例就是我试图将数据插入到数据库中,我想在一个事务中执行整个批处理,因为它的效率要高得多).这是我到目前为止的简化版本:

type ExampleType = Int

doSomething :: [ExampleType] -> IO ()
doSomething = undefined

inGroupsOf50 :: Monad m => Producer ExampleType m () -> m ()
inGroupsOf50 input =
    runEffect $ input >-> loop
        where loop = do entries <- replicateM 50 await
                    lift $ doSomething entries  --Insert a bunch all in one transaction
                    loop
Run Code Online (Sandbox Code Playgroud)

问题是我可以告诉的,除非要插入的项目数量除以50,否则我会错过一些.replicateM 50 await如果输入结束但是我无法弄清楚如何编写它,那么我真正想要的东西会给我多达50个项目或更少.

我一直在想管道解析可能是正确的库.draw看起来有一个很有希望的签名...但到目前为止,所有的位都没有在我脑海中融合在一起.我有一个producer,我正在写一个consumer,我真的不知道这与a的概念有什么关系parser.

haskell haskell-pipes

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

如何使用不依赖于hackage的自定义版本的自定义版本构建沙盒cabal项目(例如,从github检出)

如果在本地签出了一个库,该库使用应用程序使用的cabal构建.我想建立我的应用程序对抗本地库而不是hackage的东西,但我不知道如何做到这一点.这似乎是我应该做的事情,我似乎无法弄清楚如何.

沙箱

如果它重要或使事情复杂化,应用程序将位于cabal沙箱中,cabal-sandbox-config文件位于应用程序的路径目录中.

我正在努力实现的目标

我正在构建Yesod应用程序,我想调整其中一个依赖项(莎士比亚)的行为.我想根据我的调整版本构建我的应用程序.

haskell cabal cabal-install

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

使用Numeric Prelude中的Additive Class会导致重叠实例

在尝试使用数字前奏来定义一些数学对象时,我遇到了一个问题.Additive类型类定义了一个实例

instance Additive.C v => Additive.C [v]
Run Code Online (Sandbox Code Playgroud)

我读到"如果v是添加剂,[v]也是"(显然我在这里错了).它实现了类似的东西

(+) x y = map (\(a,b) -> a + b) $ zip x y
Run Code Online (Sandbox Code Playgroud)

所以[1,2,3] + [4,5,6] = [5,7,9]这对我想做的事情毫无用处.我以为我不会有问题,因为我的v类型不是Additive.不幸的是,我仍然遇到重叠的实例错误,我发现它很混乱.我做了一点阅读,我现在明白,由于某种原因,Haskell忽略了"=>"位之前的所有内容,所以我应该读取默认实例为"任何列表在默认实例的意义上都可能是附加的".我尝试使用OverlappingInstances,尽管这个扩展名称具有"危险",但即便如此也没有帮助.

这是我的测试用例.

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses,FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-} --This doesn't seem to help
import NumericPrelude

import qualified Algebra.Additive    as Additive

data Test = Red | Green | Blue deriving Show

instance Additive.C [Test] where
   zero = undefined
   (+) =  undefined
   negate = undefined

test = [Red] + [Green] …
Run Code Online (Sandbox Code Playgroud)

haskell overlapping-instances

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