这将是一个相当不错的ghc-pkg check
列出破损的包,以及为什么它们被打破.但据我所知,没有自动化的方法来处理那些破损的包裹.处理破损包裹的推荐方法是什么?(最好不要重新安装GHC)
通过ghc --make foo.hs
GHC 编译haskell源文件时,总是留下除了以外的各种中间文件foo.exe
.这些是foo.hi
和foo.o
.
我经常最终不得不删除.hi和.o文件以避免文件夹混乱.
GHC是否有命令行选项不留下其中间文件?(当被问到#haskell时,我得到的最佳答案是ghc --make foo.hs && rm foo.hi foo.o
.
我有以下代码:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
Run Code Online (Sandbox Code Playgroud)
当我运行它(带runhaskell
)或编译它(ghc 6.10.4)时,结果是这样的:
asd
Test input : asd
Run Code Online (Sandbox Code Playgroud)
为什么要Test input : asd
在之后打印asd
?
在的代码示例http://learnyouahaskell.com/,它使用putStr
,所述getLine
的呈现输出比我的不同.当我使用putStrLn
该程序按预期工作(打印,然后提示,并打印).
它是一个错误ghc
,还是它应该工作的方式?
我想用,{-# LANGUAGE OverloadedStrings #-}
但我忘记了它的名字.这种东西不具备hoogle功能,而且使用google*也需要一些时间.
是否存在一个GHC扩展列表,因为它们位于LANGUAGE
pragma中?
*我的谷歌搜索旅程:
我有一个Haskell程序,它处理一个文本文件并构建一个Map
(有几百万个元素).整件事可以运行2-3分钟.我发现调整-H和-A选项会对运行时间产生很大影响.
有关于RTS的这个功能的文档,但是对我来说这是一个很难读的,因为我不知道GC理论的算法和术语.我正在寻找一个技术性较低的解释,最好是针对Haskell/GHC.是否有关于为这些选项选择合理值的参考?
编辑:这是代码,它为给定的单词列表构建一个trie.
buildTrie :: [B.ByteString] -> MyDFA
buildTrie l = fst3 $ foldl' step (emptyDFA, B.empty, 1) $ sort $ map B.reverse l where
step :: (MyDFA , B.ByteString, Int) -> B.ByteString -> (MyDFA , B.ByteString, Int)
step (dfa, lastWord, newIndex) newWord = (insertNewStates, newWord, newIndex + B.length newSuffix) where
(pref, lastSuffix, newSuffix) = splitPrefix lastWord newWord
branchPoint = transStar dfa pref
--new state labels for the newSuffix path
newStates = [newIndex .. newIndex + …
Run Code Online (Sandbox Code Playgroud) 在Haskell中,base
库和Hackage包提供了几种将二进制IEEE-754浮点数据转换为提升Float
和Double
类型的方法.但是,这些方法的准确性,性能和可移植性尚不清楚.
对于旨在(跨)平台(反)序列化二进制格式的GHC目标库,处理IEEE-754浮点数据的最佳方法是什么?
这些是我在现有库和在线资源中遇到的方法.
这是data-binary-ieee754
包使用的方法.因为Float
,Double
,Word32
和Word64
是的每个实例Storable
中,一个能poke
源类型的值到外部缓冲器,然后peek
目标类型的一个值:
toFloat :: (F.Storable word, F.Storable float) => word -> float
toFloat word = F.unsafePerformIO $ F.alloca $ \buf -> do
F.poke (F.castPtr buf) word
F.peek buf
Run Code Online (Sandbox Code Playgroud)
在我的机器上这是有效的,但我畏缩看到分配只是为了完成强制.此外,虽然这个解决方案并不是唯一的,但这里隐含的假设是IEEE-754实际上是内存中的表示.包装附带的测试给它"在我的机器上工作"的批准印章,但这并不理想.
unsafeCoerce
使用内存中IEEE-754表示的相同隐含假设,以下代码也可以获得"在我的机器上工作"的封条:
toFloat :: Word32 -> Float
toFloat = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)
这样做的好处是不像上面的方法那样执行显式分配,但是文档说"你有责任确保旧的和新的类型具有相同的内部表示".这个隐含的假设仍然在做所有的工作,在处理提升的类型时更加费劲.
unsafeCoerce#
扩展可能被视为"便携"的限制:
toFloat :: Word -> Float
toFloat (W# w) …
Run Code Online (Sandbox Code Playgroud) 我正在为GHC制作一个插件,所以我正在阅读其中一些实现的文档.
动词"to zonk"到处都是,但是我无法找到一个解释,即什么是zonk某事或者(在广义上)当一个人想要的时候.我可以找到很多关于复杂情况的说明,在这种情况下,有必要对某些东西进行分类,但是如果不知道大局是什么,我会遇到很多麻烦.
我正在研究接收和处理JSON请求的Haskell守护程序.虽然守护进程的操作很复杂,但主要结构有意保持简单:它的内部状态只是IORef
一个数据结构,所有线程都对此执行原子操作IORef
.然后有几个线程在触发器上取值时用它做一些事情.
问题是守护进程泄漏了内存,我无法找到原因.它肯定与请求相关:当守护进程每秒收到多个请求时,它会泄漏大小为1MB/s(由Linux工具报告).内存消耗稳步增长.没有请求,内存消耗保持不变.
令我感到困惑的是,这些都没有在GHC分析中显示出来.要么我在配置文件参数中缺少某些内容,要么内存被其他内容消耗:
运行+RTS -hc -xt -p
:
运行+RTS -hr -xt -p
:
在此测试运行期间,守护程序随后消耗超过1GB.因此,分析数据显然与实际消耗的内存数量级不对应.(我知道RTS,GC和性能分析本身会增加实际内存消耗,但这种差异太大了,并不符合不断增加的消耗.)
我已经尝试rnf
了守护进程内的所有状态数据IORef
,以及解析的JSON请求(以避免部分JSON字符串保留在某处),但没有太大的成功.
欢迎任何想法或建议.
更新:守护程序没有运行-threaded
,因此没有操作系统级别的线程.
GC统计信息更接近堆分析而不是Linux报告的数字:
Alloc Copied Live GC GC TOT TOT Page Flts
bytes bytes bytes user elap user elap
[...]
5476616 44504 2505736 0.00 0.00 23.21 410.03 0 0 (Gen: 0)
35499296 41624 2603032 0.00 0.00 23.26 410.25 0 0 (Gen: 0)
51841800 46848 2701592 0.00 0.00 23.32 410.49 0 0 (Gen: …
Run Code Online (Sandbox Code Playgroud) 有时,如果没有至少一种语言扩展,我想写的一段代码是不合法的.当试图在研究论文中实现这些想法时尤其如此,这些论文倾向于使用在撰写论文时可用的任何spiffy,超扩展版本的GHC,而没有明确实际需要哪些扩展.
结果是我经常在我的.hs文件的顶部找到这样的东西:
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
Run Code Online (Sandbox Code Playgroud)
我不介意,但我常常觉得我正在做出盲目的牺牲来安抚GHC的大神.它抱怨如果没有语言扩展X,某段代码无效,所以我为X添加了一个pragma.然后它要求我启用Y,所以我为Y添加了一个pragma.到这个结束时,我已经启用我不太了解的三个或四个语言扩展,我不知道哪些是"安全的".
用"安全"来解释我的意思:
我明白这UndecidableInstances
是安全的,因为虽然它可能导致编译器不终止,只要代码编译它就不会有意想不到的副作用.
另一方面,OverlappingInstances
显然是不安全的,因为它使我很容易意外地编写产生运行时错误的代码.
所以我的问题是:
是否有GHCextensions列表被认为是"安全的"并且"不安全"?
我知道OverloadedStrings
语言编译指示包含fromString
所有字符串文字的隐含.我想要做的不是实际上重载字符串,而只是改变它们的含义以便它们总是被转换为Text
,因此,使用字符串文字作为字符列表应该导致类型错误.
如果不导入IsString
该类的String
实例,则导入该类似乎是不可能的.ghc是否为我提供了一些限制字符串文字的方法Text
?
ghc ×10
haskell ×10
buffering ×1
dependencies ×1
ieee-754 ×1
io ×1
memory-leaks ×1
performance ×1
profiling ×1