我目前正在通过在线学习你的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以什么方式解决了这个问题?
我使用最新版本的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超时的原因是什么?其次,有没有办法让我设置更长/更短的超时时间来测试它如何影响我得到的断开频率?
我一直在尝试使用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) 按照此处发布的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
我正在使用Haskell的gtk2hs库编写一个小的GUI应用程序,目前正在使用其中的多行文本框.我有一个函数,我想在用户对文本框中的文本进行更改时运行,但不希望他们必须单击按钮来激活它.
此外,因为它是一个相当侵入性和处理密集型的功能(它绘制图形,加载文件等),我希望它不会在用户进行任何更改时触发(这可能是通过文本缓冲区中的bufferChanged信号完成的)猜猜?但是当他们在两次变化之间停了几秒钟.
我目前正在开发一个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
我目前正在按照书中的练习:"哈斯克尔表达学校"进行第三章创建图形.本书使用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上运行.
我正在尝试创建一个 Haskell 程序,该程序将一些简单的 2d 形状绘制到屏幕上,但是当您将鼠标悬停在每个形状上时,它会打印创建该形状的源代码行。
为了做到这一点,我希望能够创建带有尺寸参数和指示行号的最终参数的形状。像这样的东西:
rect1 = Shape(Rectangle 2 2 lineNumber)
Run Code Online (Sandbox Code Playgroud)
这将创建一个宽度为 2 像素、高度为 2 像素的矩形,并使用函数 lineNumber 来存储编写这段代码的行。Haskell 中是否存在这样的函数?创建一个简单吗?
我搜索了堆栈溢出并发现了这个问题,其中回答者建议可以使用 C++ 中的 __LINE__ pragma 来实现类似的效果。这是最好的方法还是有办法在纯 Haskell 中做到这一点?
我正在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) 作为课程作业的一部分,我们的任务是在UDP层上提供额外的可靠性层,以便发送大图片文件.这是使用Go-Back-N协议完成的:http://en.wikipedia.org/wiki/Go_back_N
根据我的理解,这个问题的关键在于能够发送数据包,同时检查是否有任何致谢已经进入旧数据包,这将允许您移动窗口.
我目前通过两个线程执行此操作:如果窗口中有空间,则发送下一个数据包; 并且不断地听取任何传入的确认并做出适当的反应.
我的问题是该程序应该是线程化的,就好像这两个线程同时动作一样,但事实上,似乎ACKReceiver线程正在获得非常不成比例的时间.从线程转储中,当它到达DataSocket.receive()行时,它似乎"饿死"了发送线程一段时间,阻止了执行,而没有让其他线程有机会在此期间运行.
我已经看过以下问题,似乎暗示问题与DatagramSocket.receive同步的事实有关......但是没有提供问题的可用解决方案:
这是我的代码的发件人部分的代码,我相对确定另一方的接收器是完全正常的(一方面,我没有必要使用任何线程来使其工作!):
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) 我正在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)
我可以通过简单地创建一个正则表达式来提取每个数字,该表达式查找数字字符的每个实例而不包含它们的字母.同样如果我想找到所有颜色,我可以硬编码正则表达式,搜索红色或绿色或蓝色等的出现...等.
我用这种方法看到的问题是:
如果我想要更改我要搜索的类型,我必须硬编码该类型可以表现出来的每种可能方式
如果函数调用返回类型值,则它不起作用.例如,如果p1改为:
p1 = Region(getColor 1)r1
哪里:
getColor :: Int -> Color
getColor …Run Code Online (Sandbox Code Playgroud) 目前,我正在编写一个Haskell程序,在某个时候,我需要通过使用我自己的信息和功能来扩充别人输入到系统中的Haskell代码。例如,我可能希望找到用户写过的所有地方,例如:
a =形状(矩形3 5)
并用其他数据(例如,它们出现的行号或有关编写它们的用户的信息)更改这些条目:
a = TrackedShape(74“ John”(矩形3 5))
为了进行查找和替换,我尝试仅使用正则表达式,但发现在许多情况下它们的表现力不足以捕获所有用例。特别是对于上面的示例,我将需要捕获shape构造函数中包含的所有内容,因此需要知道匹配的括号是什么。
我还试图查看诸如haskell-src-exts之类的解析器是否对我有用,但我不确定。看起来,虽然这类库可能最适合最初解析Haskell代码,但它们缺乏解析代码,更改解析树,然后将解析后的代码改回其原始形式,同时保留原始文本结构的能力。 。
是否有任何对此类任务有用的库?还是失败了,我是否可以编写某种功能来提供强大的搜索功能并替代此功能?
我正在尝试学习如何使用Javascript库传单和d3来创建各种地图可视化.
我一直在关注这个教程,它创建了一个具有一定互动性的美国等值线图.这提供了我需要的一些东西,但我想要的主要功能是根据它们属于哪个区域来分类纬度/经度坐标.
这意味着,在教程地图中,例如,如果我有一个纬度较长的值(55,-3)属于亚利桑那州的多边形状态,程序可以将此点归类为属于亚利桑那州.
在传单(或d3)库中是否有一个函数允许我输入lat长坐标作为参数并返回它所属的特征的名称?上面的教程允许您通过onEveryFeature属性将函数附加到每个要素,并且可以在每个要素悬停时触发鼠标悬停事件.当然有一种方法可以将此功能扩展到数字输入数据而不是鼠标点?
haskell ×9
ghc ×2
graphics ×2
java ×2
javascript ×2
parsing ×2
regex ×2
api ×1
d3.js ×1
geocoding ×1
geometry ×1
ghc-api ×1
go-back-n ×1
gtk ×1
gtk2hs ×1
interpreter ×1
io ×1
json ×1
kotlin ×1
leaflet ×1
list ×1
livecoding ×1
node.js ×1
parentheses ×1
performance ×1
pragma ×1
replace ×1
signals ×1
socket.io ×1
sockets ×1
types ×1
udp ×1
websocket ×1