我正在使用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)
所以,u
in ParsecT s u m a
会Set.Set …
我正在尝试通过Heinrich Apfelmus的反应性香蕉来了解FRP ,与我所看到的其他相比,它似乎是一个文档齐全且简单的库.
但是,我无法绕过AddHandler类型.假设我想使用GLFW来获取鼠标按钮,以便我有类似的东西eMouseButton :: Event ()
.看看这些例子,似乎我不得不使用fromAddHandler,但我不知道如何组装该AddHandler
参数.我想我不得不以newAddHandler
某种方式使用,但是怎么样?
我想一个如何连接reactive-banana
到其他东西的例子wx
会有很大帮助.
我正在尝试在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' _ …
这实际上是这个问题的后续问题.我设法让分析工作,问题似乎真的是懒惰的评价.
我正在使用的数据结构是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) 副轴图的图例以某种方式对另一轴的图是透明的.重现问题的最小示例:
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)