小编Cra*_*nes的帖子

为什么差异列表比常规连接更有效?

我目前正在通过在线学习你的Haskell书籍的方式,并且已经到了一个章节,作者正在解释一些列表连接可能效率低下:例如

((((a ++ b) ++ c) ++ d) ++ e) ++ f
Run Code Online (Sandbox Code Playgroud)

据说效率低下.作者提出的解决方案是使用定义为的"差异列表"

newtype DiffList a = DiffList {getDiffList :: [a] -> [a] }

instance Monoid (DiffList a) where
    mempty = DiffList (\xs -> [] ++ xs)
    (DiffList f) `mappend` (DiffList g) = DiffList (\xs -> f (g xs))
Run Code Online (Sandbox Code Playgroud)

我很难理解为什么DiffList在某些情况下比简单串联更具计算效率.有人可以用简单的语言向我解释为什么上面的例子是如此低效,以及DiffList以什么方式解决了这个问题?

performance haskell list time-complexity difference-lists

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

Socket.io随机断开(v1.0.6)

我使用最新版本的socket.io(1.0.6)与Phaser和Node进行在线多人游戏.我的问题是,一旦客户端连接,他们偶尔会随机断开连接.似乎没有发生这种情况的具体情况.有时它是在游戏完全空闲的时候,有时候所有玩家都在向服务器发送输入.

通过检查socket.io的调试输出,我发现断开连接的原因是"ping超时".具体来说,从socket.js库文件中触发以下行:

Socket.prototype.setPingTimeout = function () {
  var self = this;
  clearTimeout(self.pingTimeoutTimer);
  self.pingTimeoutTimer = setTimeout(function () {
    self.onClose('ping timeout'); // <------------------------
  }, self.server.pingInterval + self.server.pingTimeout);
};
Run Code Online (Sandbox Code Playgroud)

这会发生什么原因吗?我只是通过localhost测试我的服务器,所以我没有理由认为会有任何明显的延迟导致超时.我的套接字是根据socket.io网站上的聊天应用示例设置的:

服务器:

//http server setup
var io = require('socket.io')(http);
io.on('connection', function(socket){
  //Game logic,socket listeners, io.emits
});
Run Code Online (Sandbox Code Playgroud)

客户:

var socket = io();
//client side listeners, emissions back to server
Run Code Online (Sandbox Code Playgroud)

我的问题首先是我间歇性地获得ping超时的原因是什么?其次,有没有办法让我设置更长/更短的超时时间来测试它如何影响我得到的断开频率?

javascript sockets websocket node.js socket.io

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

Haskell GHC API错误中的动态编译

我一直在尝试使用GHC API进行一些基本的动态代码编译,遵循此处的教程.

这段代码:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultDynFlags $ do
      func <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "Test.hs" Nothing
        addTarget target
        r <- load LoadAllTargets
        case r of
          Failed -> error "Compilation failed"
          Succeeded -> do
            m <- findModule (mkModuleName "Test") Nothing
            setContext [] [m]
            value <- compileExpr ("Test.print")
            do let value' = (unsafeCoerce value) :: String -> IO …
Run Code Online (Sandbox Code Playgroud)

compiler-construction api haskell dynamic-compilation ghc

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

Haskell GHC Dynamic Compliation仅适用于第一次编译

按照此处发布的GHC教程和此代码的更改,遵循我之前的堆栈溢出问题中的建议,我已经创建了一个程序,它能够在Test.hs中编译和运行一个带有函数print的模块来打印字符串到屏幕:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultLogAction $ do
      func <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "Test.hs" Nothing
        addTarget target
        r <- load LoadAllTargets
        case r of
          Failed -> error "Compilation failed"
          Succeeded -> do
            m <- findModule (mkModuleName "Test") Nothing
            setContext [IIModule m]
            value <- compileExpr ("Test.print")
            do let value' = (unsafeCoerce value) :: String -> IO …
Run Code Online (Sandbox Code Playgroud)

compiler-construction haskell dynamic-compilation ghc ghc-api

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

用户停止输入文本时运行功能

我正在使用Haskell的gtk2hs库编写一个小的GUI应用程序,目前正在使用其中的多行文本框.我有一个函数,我想在用户对文本框中的文本进行更改时运行,但不希望他们必须单击按钮来激活它.

此外,因为它是一个相当侵入性和处理密集型的功能(它绘制图形,加载文件等),我希望它不会在用户进行任何更改时触发(这可能是通过文本缓冲区中的bufferChanged信号完成的)猜猜?但是当他们在两次变化之间停了几秒钟.

基本上我想知道gtk中是否有类似于范围小部件可以将其更新策略设置为连续或延迟的方式,但对于文本框

gtk user-interface haskell signals gtk2hs

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

System.Plugins加载器似乎在看到一次失败后假设失败

我目前正在开发一个haskell程序,它从文本框中获取用户输入,然后使用System.Plugins库编译并加载它,以便提取要绘制到屏幕的图片.用户可以在文本框中编辑代码,然后通过单击编译按钮重新加载新图像.以下是单击编译按钮时触发的代码:

compileText :: SourceView -> SOE.Window -> IO ()
compileText tview w = do 
    txtBuff <- textViewGetBuffer tview
    startIt <- textBufferGetStartIter txtBuff
    endIt <- textBufferGetEndIter txtBuff
    compTime <- getClockTime
    srcString <- textBufferGetByteString txtBuff startIt endIt False

    BS.writeFile "Test.hs" srcString
    mkStat <- make "Test.hs" []
    case mkStat of
        MakeSuccess cd fp -> print fp
        MakeFailure (er1:er2:errs) -> error er2

    loadResult <- getModule
    case loadResult of
        Right (md, pic) -> do
                runGraphics $ do
                    draw3 "gtk test" pic w
                unload …
Run Code Online (Sandbox Code Playgroud)

compiler-construction interpreter haskell dynamic-compilation

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

Haskell SOEGraphics窗口不会关闭

我目前正在按照书中的练习:"哈斯克尔表达学校"进行第三章创建图形.本书使用SOEGraphics模块,演示在窗口中绘制一些简单文本,然后按下按钮关闭它.

但是,在编译和执行后,我发现尽管窗口出现了屏幕上的文本,但无论我按哪个键或者焦点是在命令行还是窗口本身,窗口都会拒绝关闭.

以下是本书的源代码:

module Main where
import SOE
main =  runGraphics(
        do  w <- openWindow
                "My First Graphics Program" (300, 300)
            drawInWindow w (text(100,200) "HelloGraphicsWorld")
            k <- getKey w
            closeWindow w
        )
Run Code Online (Sandbox Code Playgroud)

让窗口关闭的唯一方法是强制它使用CTRL-C退出.我的代码中是否有一些我忽略的东西?该程序使用GHC 7.4.1编译,并在Ubuntu上运行.

io graphics haskell

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

在 Haskell 中查找函数的行号

我正在尝试创建一个 Haskell 程序,该程序将一些简单的 2d 形状绘制到屏幕上,但是当您将鼠标悬停在每个形状上时,它会打印创建该形状的源代码行。

为了做到这一点,我希望能够创建带有尺寸参数和指示行号的最终参数的形状。像这样的东西:

rect1 = Shape(Rectangle 2 2 lineNumber)
Run Code Online (Sandbox Code Playgroud)

这将创建一个宽度为 2 像素、高度为 2 像素的矩形,并使用函数 lineNumber 来存储编写这段代码的行。Haskell 中是否存在这样的函数?创建一个简单吗?

我搜索了堆栈溢出并发现了这个问题,其中回答者建议可以使用 C++ 中的 __LINE__ pragma 来实现类似的效果。这是最好的方法还是有办法在纯 Haskell 中做到这一点?

compiler-construction graphics haskell pragma livecoding

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

通过JSON配置选择策略

我正在Java/Kotlin中实现学习代理.该代理的一部分功能涉及搜索大量可能的选项.搜索可能性空间有很多好方法,我经常改变自己的想法,哪一个是最好的.因此,我决定将其作为一种战略模式来实施.

class Agent(val searchStrategy : SearchStrategy){
    fun search(input : InputGraph) : Result{
        return searchStrategy.search()
    }
}

interface SearchStrategy{
    fun search(input : InputGraph) : Result
}

class FastSearch : SearchStrategy{
    //implementation here
}

class AccurateSearch : SearchStrategy{
   // implementation here
}

class ExperimentalSerach : SearchStrategy{
  // implentation here
}
Run Code Online (Sandbox Code Playgroud)

最近,我决定运行一系列实验来测试各种系统参数的有效性.这是通过python脚本完成的,它通过运行带有不同config.json文件的编译jar作为参数来完成每个实验.就像是:

{
    "numSamples" : 5000,
    "environmentDifficulty" : 3,
    "hazardProbability" : 0.4,
    //etc..
}
Run Code Online (Sandbox Code Playgroud)

我现在想让实验者能够配置代理使用的策略.做这个的最好方式是什么?我的直接想法是我可以在config.json中添加一个额外的字符串字段:

{
    "numSamples" : 5000,
    "environmentDifficulty" : 3,
    "hazardProbability" : 0.4,
    "agentStrategy": "FastSearch"
}
Run Code Online (Sandbox Code Playgroud)

然后使用when或if分支在主系统中构建它:

val searchStrategy = when(config.agentStrategy){ …
Run Code Online (Sandbox Code Playgroud)

java configuration json design-patterns kotlin

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

数据报套接字在我的UDP程序中饿死其他线程

作为课程作业的一部分,我们的任务是在UDP层上提供额外的可靠性层,以便发送大图片文件.这是使用Go-Back-N协议完成的:http://en.wikipedia.org/wiki/Go_back_N

根据我的理解,这个问题的关键在于能够发送数据包,同时检查是否有任何致谢已经进入旧数据包,这将允许您移动窗口.

我目前通过两个线程执行此操作:如果窗口中有空间,则发送下一个数据包; 并且不断地听取任何传入的确认并做出适当的反应.

我的问题是该程序应该是线程化的,就好像这两个线程同时动作一样,但事实上,似乎ACKReceiver线程正在获得非常不成比例的时间.从线程转储中,当它到达DataSocket.receive()行时,它似乎"饿死"了发送线程一段时间,阻止了执行,而没有让其他线程有机会在此期间运行.

我已经看过以下问题,似乎暗示问题与DatagramSocket.receive同步的事实有关......但是没有提供问题的可用解决方案:

Java线程不会在I/O操作上暂停

这是我的代码的发件人部分的代码,我相对确定另一方的接收器是完全正常的(一方面,我没有必要使用任何线程来使其工作!):

import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;

public class Sender3 {
    short base = 0;
    short nextSeqNum = 0;
    DatagramPacket[] packets;
    ByteBuffer bb;
    String endSys;
    int portNum;
    String fileName;
    int retryTime;
    int windowSize;
    DatagramSocket clientSocket;
    InetAddress IPAddress;
    boolean timedOut = false;

    public Sender3(String endSys, int portNum, String fileName, int retryTime, int windowSize){
        this.endSys = endSys;
        this.portNum = portNum;
        this.fileName = fileName;
        this.retryTime = retryTime;
        this.windowSize = windowSize;
    }

    public static …
Run Code Online (Sandbox Code Playgroud)

java multithreading udp go-back-n

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

在Haskell中提取特定类型的所有出现

我正在Haskell中编写一些程序,它们以某种方式操作Haskell源代码.我希望能够做的一件事是提取特定类型的所有事件(也可能是它们的位置).

我认为使用正则表达式的非常粗略的方法适用于简单的数据类型.例如,在以下图形代码中:

module Test where
    import Picture

    r1,r2,r3,r4 :: Region
    r1 = Shape(Rectangle 2 2)
    r2 = Shape(Ellipse 2 1.5)
    r3 = Shape(RtTriangle 3 2)
    r4 = Shape(Polygon [(-2.5, 2.5), (-3.0,0), (-1.7,-1.0), (-1.1,0.2),(-1.5,2.0)])

    p1,p2,p3,p4 :: Picture
    p1 = Region Red r1
    p2 = Region Green r2
    p3 = Region Blue r3
    p4 = Region Yellow r4

    pic :: Picture
    pic = foldl Over EmptyPic [p1,p2,p3,p4]
Run Code Online (Sandbox Code Playgroud)

我可以通过简单地创建一个正则表达式来提取每个数字,该表达式查找数字字符的每个实例而不包含它们的字母.同样如果我想找到所有颜色,我可以硬编码正则表达式,搜索红色或绿色或蓝色等的出现...等.

我用这种方法看到的问题是:

  1. 如果我想要更改我要搜索的类型,我必须硬编码该类型可以表现出来的每种可能方式

  2. 如果函数调用返回类型值,则它不起作用.例如,如果p1改为:

    p1 = Region(getColor 1)r1

哪里:

getColor :: Int -> Color
getColor …
Run Code Online (Sandbox Code Playgroud)

regex parsing haskell types metaprogramming

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

用于查找和替换的Haskell括号匹配

目前,我正在编写一个Haskell程序,在某个时候,我需要通过使用我自己的信息和功能来扩充别人输入到系统中的Haskell代码。例如,我可能希望找到用户写过的所有地方,例如:

a =形状(矩形3 5)

并用其他数据(例如,它们出现的行号或有关编写它们的用户的信息)更改这些条目:

a = TrackedShape(74“ John”(矩形3 5))

为了进行查找和替换,我尝试仅使用正则表达式,但发现在许多情况下它们的表现力不足以捕获所有用例。特别是对于上面的示例,我将需要捕获shape构造函数中包含的所有内容,因此需要知道匹配的括号是什么。

我还试图查看诸如haskell-src-exts之类的解析器是否对我有用,但我不确定。看起来,虽然这类库可能最适合最初解析Haskell代码,但它们缺乏解析代码,更改解析树,然后将解析后的代码改其原始形式,同时保留原始文本结构的能力。 。

是否有任何对此类任务有用的库?还是失败了,我是否可以编写某种功能来提供强大的搜索功能并替代此功能?

regex parsing haskell replace parentheses

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

LatLong属于D3 + Leaflet中的给定多边形

我正在尝试学习如何使用Javascript库传单d3来创建各种地图可视化.

我一直在关注这个教程,它创建了一个具有一定互动性的美国等值线图.这提供了我需要的一些东西,但我想要的主要功能是根据它们属于哪个区域来分类纬度/经度坐标.

这意味着,在教程地图中,例如,如果我有一个纬度较长的值(55,-3)属于亚利桑那州的多边形状态,程序可以将此点归类为属于亚利桑那州.

在传单(或d3)库中是否有一个函数允许我输入lat长坐标作为参数并返回它所属的特征的名称?上面的教程允许您通过onEveryFeature属性将函数附加到每个要素,并且可以在每个要素悬停时触发鼠标悬停事件.当然有一种方法可以将此功能扩展到数字输入数据而不是鼠标点?

javascript geometry geocoding d3.js leaflet

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