标签: ghc

解决ghc-pkg检查中发现的问题

这将是一个相当不错的ghc-pkg check列出破损的包,以及为什么它们被打破.但据我所知,没有自动化的方法来处理那些破损的包裹.处理破损包裹的推荐方法是什么?(最好不要重新安装GHC)

dependencies haskell ghc

39
推荐指数
2
解决办法
7103
查看次数

如何阻止GHC生成中间文件?

通过ghc --make foo.hsGHC 编译haskell源文件时,总是留下除了以外的各种中间文件foo.exe.这些是foo.hifoo.o.

我经常最终不得不删除.hi和.o文件以避免文件夹混乱.

GHC是否有命令行选项不留下其中间文件?(当被问到#haskell时,我得到的最佳答案是ghc --make foo.hs && rm foo.hi foo.o.

haskell ghc

38
推荐指数
4
解决办法
6129
查看次数

错误的IO操作使用putStr和getLine进行排序

我有以下代码:

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,还是它应该工作的方式?

io haskell buffering ghc

38
推荐指数
1
解决办法
3015
查看次数

我在哪里可以找到所有GHC扩展的列表

我想用,{-# LANGUAGE OverloadedStrings #-}但我忘记了它的名字.这种东西不具备hoogle功能,而且使用google*也需要一些时间.

是否存在一个GHC扩展列表,因为它们位于LANGUAGEpragma中?

*我的谷歌搜索旅程:

haskell ghc

38
推荐指数
3
解决办法
8707
查看次数

GHC的垃圾收集RTS选项

我有一个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)

performance garbage-collection haskell ghc

38
推荐指数
2
解决办法
8549
查看次数

将Haskell Word32/64中的IEEE 754浮点转换为Haskell Float/Double

在Haskell中,base库和Hackage包提供了几种将二进制IEEE-754浮点数据转换为提升FloatDouble类型的方法.但是,这些方法的准确性,性能和可移植性尚不清楚.

对于旨在(跨)平台(反)序列化二进制格式的GHC目标库,处理IEEE-754浮点数据的最佳方法是什么?

途径

这些是我在现有库和在线资源中遇到的方法.

FFI Marshaling

这是data-binary-ieee754包使用的方法.因为Float,Double,Word32Word64是的每个实例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)

floating-point haskell ghc ieee-754

38
推荐指数
4
解决办法
3790
查看次数

GHC来源对"zonk"意味着什么?

我正在为GHC制作一个插件,所以我正在阅读其中一些实现的文档.

动词"to zonk"到处都是,但是我无法找到一个解释,即什么是zonk某事或者(在广义上)当一个人想要的时候.我可以找到很多关于复杂情况的说明,在这种情况下,有必要对某些东西进行分类,但是如果不知道大局是什么,我会遇到很多麻烦.

haskell ghc

38
推荐指数
1
解决办法
825
查看次数

调试堆分析中未显示的内存泄漏

我正在研究接收和处理JSON请求的Haskell守护程序.虽然守护进程的操作很复杂,但主要结构有意保持简单:它的内部状态只是IORef一个数据结构,所有线程都对此执行原子操作IORef.然后有几个线程在触发器上取值时用它做一些事情.

问题是守护进程泄漏了内存,我无法找到原因.它肯定与请求相关:当守护进程每秒收到多个请求时,它会泄漏大小为1MB/s(由Linux工具报告).内存消耗稳步增长.没有请求,内存消耗保持不变.

令我感到困惑的是,这些都没有在GHC分析中显示出来.要么我在配置文件参数中缺少某些内容,要么内存被其他内容消耗:

运行+RTS -hc -xt -p:

profiler输出的屏幕截图

运行+RTS -hr -xt -p:

profiler输出的屏幕截图

在此测试运行期间,守护程序随后消耗超过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)

profiling haskell memory-leaks ghc

37
推荐指数
1
解决办法
1223
查看次数

是否有一个被认为是"安全"的GHC扩展名单?

有时,如果没有至少一种语言扩展,我想写的一段代码是不合法的.当试图在研究论文中实现这些想法时尤其如此,这些论文倾向于使用在撰写论文时可用的任何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列表被认为是"安全的"并且"不安全"?

haskell ghc

36
推荐指数
1
解决办法
2097
查看次数

将字符串文字限制为仅限文本

我知道OverloadedStrings语言编译指示包含fromString所有字符串文字的隐含.我想要做的不是实际上重载字符串,而只是改变它们的含义以便它们总是被转换为Text,因此,使用字符串文字作为字符列表应该导致类型错误.

如果不导入IsString该类的String实例,则导入该类似乎是不可能的.ghc是否为我提供了一些限制字符串文字的方法Text

haskell ghc string-literals overloaded-strings

36
推荐指数
1
解决办法
3632
查看次数