小编bzn*_*bzn的帖子

Parsec中的用户状态

我正在使用Parsec解析表达式,我想使用Parsec中的用户状态跟踪这些表达式中的变量.不幸的是我真的没办法怎么做.

给出以下代码:

import Data.Set as Set
inp = "$x = $y + $z"

data Var = V String

var = do char '$'
      n <- many1 letter
      let v = Var n
       -- I want to modify the set of variables here
      return v

parseAssignment = ... -- parses the above assignment

run = case runIdentity $ runParserT parseAssignment Set.empty "" inp of
                   Left err -> ...
                   Right -> ...
Run Code Online (Sandbox Code Playgroud)

所以,uin ParsecT s u m aSet.Set …

state haskell parsec

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

reactive-banana:如何创建AddHandler?

我正在尝试通过Heinrich Apfelmus的反应性香蕉来了解FRP ,与我所看到的其他相比,它似乎是一个文档齐全且简单的库.

但是,我无法绕过AddHandler类型.假设我想使用GLFW来获取鼠标按钮,以便我有类似的东西eMouseButton :: Event ().看看这些例子,似乎我不得不使用fromAddHandler,但我不知道如何组装该AddHandler参数.我想我不得不以newAddHandler某种方式使用,但是怎么样?

我想一个如何连接reactive-banana到其他东西的例子wx会有很大帮助.

haskell reactive-programming reactive-banana

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

编辑Haskell中的距离算法 - 性能调优

我正在尝试在Haskell中实现levenshtein距离(或编辑距离),但是当字符串长度增加时,它的性能会迅速下降.

我仍然是Haskell的新手,所以如果你能就我如何改进算法给我一些建议会很好.我已经尝试"预先计算"值(inits),但由于它没有改变任何东西,我还原了那个改变.

我知道Hackage上已有一个editDistance实现,但是我需要它来处理任意标记的列表,而不一定是字符串.另外,我发现它有点复杂,至少与我的版本相比.

那么,这是代码:

-- standard levenshtein distance between two lists
editDistance      :: Eq a => [a] -> [a] -> Int
editDistance s1 s2 = editDistance' 1 1 1 s1 s2 

-- weighted levenshtein distance
-- ins, sub and del are the costs for the various operations
editDistance'      :: Eq a => Int -> Int -> Int -> [a] -> [a] -> Int
editDistance' _ _ ins s1 [] = ins * length s1 
editDistance' _ …

performance haskell

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

内存分析改变了内存使用情况(为了更好)

这实际上是这个问题的后续问题.我设法让分析工作,问题似乎真的是懒惰的评价.

我正在使用的数据结构是a Map Int (Map Int Text),其中Text来自Data.Text.问题是,构建此映射的函数会产生巨大的影响.处理大约3 MB的输入文本时,程序需要超过250 MB的内存.

现在来看这个问题的真正目的:

要获取此数据结构中的字符数,请使用以下函数:

type TextResource = M.Map Int (M.Map Int T.Text)

totalSize :: TextResouce -> Int
totalSize = M.fold ((+) . (M.fold ((+). T.length) 0)) 0
Run Code Online (Sandbox Code Playgroud)

不漂亮,但它完成了工作.我在创建TextResource后立即在main函数中使用此函数.有趣的是,当我使用RTS选项配置程序时,-hr或者-hc内存使用量在一段时间后降至70或50 MB,这将是完全正常的.

不幸的是,这仅在使用性能分析选项和totalSize功能时才有效- 没有它们它会回到250 MB.

我将程序(<70行)与测试文件和cabal文件一起上传,以便您可以自己尝试:链接

test.xml是生成的XML文件,应放入executables目录中.要构建,cabal configure --enable-executable-profiling之后cabal build应该足够了(如果你安装了所需库的分析版本).

您可以在运行程序时看到更改一次,+RTS -hc一次运行没有.

如果有人可以运行这个程序,我真的很棒,因为我真的被困在这里.我已经尝试过deepseq几个地方,但没有任何作用(好吧,除了使用分析选项).

编辑:

然而,分析确实表明只使用了大约20MB的堆,因此在我的评论中,我责怪GHC没有像你想要的那样释放尽可能多的GC托儿所内存.

谢谢,这指出了我正确的方向.事实证明,你可以告诉GHC执行垃圾收集(performGC),在深度调整地图后,它可以很好地工作.虽然我猜不推荐使用performGC,但这似乎是适合这项工作的正确工具.

Edit2: 这是我改变main函数的方法(+ deepseqing返回buildTextFile):

main = do …
Run Code Online (Sandbox Code Playgroud)

haskell memory-profiling

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

使用辅助轴时,图例透明度

副轴图的图例以某种方式对另一轴的图是透明的.重现问题的最小示例:

import matplotlib.pyplot as plt

ax1 = plt.subplot(111)
ax2 = ax1.twinx()
ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r')  
ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')
ax1.legend(loc=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我得到的输出是: 错误的情节

如您所见,蓝色图的图例被红色图透支.重新排列绘图命令,更改alpha值或更改对象的z顺序没有帮助.

有没有办法让传说对所有情节都不透明?

编辑:@ tcaswell:虽然您的答案适用于单个图例,但如果两个轴都有单独的图例,则它不起作用.在以下代码中,我添加了一个标签ax2:

import matplotlib.pyplot as plt
plt.figure()
ax1 = plt.subplot(111)
ax2 = ax1.twinx()
ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r', label='ax2')  
ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')
ax1.legend(loc=2)
ax2.legend(loc=1)

ax1.set_zorder(1) # make it on top
ax1.set_frame_on(False) # make it transparent
ax2.set_frame_on(True) # make sure …
Run Code Online (Sandbox Code Playgroud)

python matplotlib

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