小编Mic*_*Fox的帖子

如何使用Language.Haskell.Interpreter发送可执行文件?

我希望能够嵌入一个Haskell解释器,hint这样我就可以在Haskell中编写插件来与我的程序一起使用.我不想为我的可执行文件发布整个Haskell平台.

通常,Haskell可执行文件是非常独立的.例如,擦除PATH不会导致问题:

$ PATH=. Hello
Hello world
Run Code Online (Sandbox Code Playgroud)

但是,runInterpreter如果我删除了一个简单的测试程序使用炸弹PATH:

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"
Run Code Online (Sandbox Code Playgroud)

环境中必须提供哪些库或可执行文件才能使其工作?

otool 没有提供太多指导:

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)
Run Code Online (Sandbox Code Playgroud)

测试代码TryHint没有做太多:

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter …
Run Code Online (Sandbox Code Playgroud)

haskell packaging shipping

136
推荐指数
1
解决办法
2025
查看次数

为什么我的小STRef Int需要分配千兆字节?

3,200,056,496 bytes allocated in the heap
Run Code Online (Sandbox Code Playgroud)

武汉理工大学?这是STRef的一个小测试:

bigNumber =
    runST $ do
        ref <- newSTRef (0 :: Int)
        replicateM_ 100000000 $ modifySTRef' ref (+1)
        readSTRef ref
Run Code Online (Sandbox Code Playgroud)

modifySTRef'是严格的.STRef应该直接在内存上运行,所以我不认为需要大量的分配.

这是完整的代码:

import Control.Monad.ST
import Control.Monad
import Data.STRef

bigNumber :: Int
bigNumber =
    runST $ do
        ref <- newSTRef (0 :: Int)
        replicateM_ 100000000 $ modifySTRef' ref (+1)
        readSTRef ref

main :: IO ()
main = print bigNumber
Run Code Online (Sandbox Code Playgroud)

构建用于分析如下:

ghc -O2 -rtsopts -prof -auto-all -caf-all -fforce-recomp tryST.hs
Run Code Online (Sandbox Code Playgroud)

运行如下:

./tryST +RTS -pa …
Run Code Online (Sandbox Code Playgroud)

optimization haskell

13
推荐指数
1
解决办法
540
查看次数

构造函数/案例/警卫/ if-then-else的顺序对性能有影响吗?

我在Containers/Data/Set/Base.hs中看到了这条评论

-- [Note: Order of constructors]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- The order of constructors of Set matters when considering performance.
-- Currently in GHC 7.0, when type has 2 constructors, a forward conditional
-- jump is made when successfully matching second constructor. Successful match
-- of first constructor results in the forward jump not taken.
-- On GHC 7.0, reordering constructors from Tip | Bin to Bin | Tip
-- improves the benchmark by up to 10% on x86.
Run Code Online (Sandbox Code Playgroud)

订单还有哪些地方对业绩产生微小的可衡量影响?特别是我想知道有很多选项的案例陈述.

optimization haskell ghc

12
推荐指数
1
解决办法
346
查看次数

是否有GCC编译指示可以打开和关闭C++ 11?

我有一些与C++ 11斗争的标题,但我想在我的代码中使用初始化列表等功能.我的研究表明,您只能在命令行启用更新的功能,例如:

g++ -std=c++11
Run Code Online (Sandbox Code Playgroud)

我真正喜欢的是输入我的代码:

#pragma CXX11_OFF
#include <old.hpp>
#pragma CXX11_ON

vector<int> v {1,2,3};
Run Code Online (Sandbox Code Playgroud)

我一直没能找到这样的实用工具.它存在吗?

c++ gcc c++11

9
推荐指数
1
解决办法
2584
查看次数

`threadDelay(maxBound :: Int)`是否会导致GHC错误或什么?

我希望我的程序基本上永远锁定,我的第一个想法是:

threadDelay (maxBound :: Int)
Run Code Online (Sandbox Code Playgroud)

这给了一些虚假的警告:

Prelude> import Control.Concurrent
Prelude Control.Concurrent> threadDelay 10
Prelude Control.Concurrent> threadDelay (maxBound :: Int)
<interactive>: c_poll: invalid argument (Invalid argument)
<interactive>: ioManagerWakeup: write: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

我做错了还是做了GHC?

haskell ghc

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

Chisel和Lava与CLaSH有什么区别?

我一直在研究Chisel以及各种Lavas(堪萨斯,Chalmers和Xilinx口味)和CLaSH的来源.我试图了解Chisel与其他产品的主要卖点是什么.我发现的主要是快速模拟.

我想知道深入研究的人是否可以指出其他优点,缺点和权衡取舍.

(对不起,如果讨论问题太多了.我试着向凿子用户发帖,但显然你需要被接受为会员才能这样做.)

lava clash chisel

7
推荐指数
1
解决办法
1053
查看次数

如何启用BinaryLiterals?

在Language.Haskell.Extensions文档中提到了BinaryLiterals扩展.你可以说这个想法0b11 == 3.

> :set -XBinaryLiterals
Some flags have not been recognized: -XBinaryLiterals
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

CString可以是IsString的一个实例,Show?

newCString :: String -> IO CString
peekCString :: CString -> IO String
Run Code Online (Sandbox Code Playgroud)

你需要

fromString :: String -> a
show :: a -> String
Run Code Online (Sandbox Code Playgroud)

我的跛脚尝试

{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverlappingInstances #-}

module Main where

import Data.String
import Foreign.C.String
import System.IO.Unsafe

instance IsString CString where
  fromString = unsafePerformIO . newCString

instance {-# OVERLAPS #-} Show CString where
  show = unsafePerformIO . peekCString

mycs :: CString
mycs = "hello CString"

main = …
Run Code Online (Sandbox Code Playgroud)

haskell

6
推荐指数
2
解决办法
146
查看次数

如何在Haskell中进行Lazy Map反序列化

与@Gabriel Gonzalez的这个问题类似:如何在Haskell中进行快速数据反序列化

我有一个很大的地图,里面有我使用Cerial序列化的整数和文本.该文件大约是10M.

每次我运行我的程序时,我都会对整个事件进行反序列化,这样我就可以查找一些项目了.反序列化需要大约500毫秒,这不是什么大问题,但我似乎总是喜欢周五的分析.

当我只需要一些项目时,总是将100k到100个项目反序列化似乎很浪费.

我尝试decodeLazy并将地图更改为Data.Map.Lazy(不太了解地图可以如何懒惰,但确定,它就在那里)并且这对时间没有影响,除非它可能有点慢.

我想知道是否有一些东西可以更聪明,只需加载和解码所需的东西.当然,像sqlite这样的数据库可能非常大,但它只加载完成查询所需的内容.我想找到类似的东西但不必创建数据库模式.

更新

你知道什么会很棒吗?一些Mongo与Sqlite的融合.就像你可以拥有一个使用平面文件存储的JSON文档数据库......当然有人在Ruby中做了它https://github.com/hamiltop/MongoLiteDB ... :(

思想mmap可能有所帮助.mmap第一次尝试了图书馆和隔离的GHCI.不知道怎么能报告那个bug.

尝试过的bytestring-mmap库,但有效,但没有性能提升.只是替换这个:

ser <- BL.readFile cacheFile
Run Code Online (Sandbox Code Playgroud)

有了这个:

ser <- unsafeMMapFile cacheFile
Run Code Online (Sandbox Code Playgroud)

更新2

keyvaluehash可能只是门票.表现似乎非常好.但API很奇怪,缺少文档,因此需要进行一些实验.

更新3:我是个白痴

显然,我想要的不是地图的更加懒惰的反序列化.我想要一个键值数据库,有几个选项可供选择,比如dvm,tokyo-cabinet和我以前从未见过的这个levelDB.

Keyvaluehash看起来是我喜欢的native-Haskell键值数据库,但我仍然不知道质量.例如,您不能向数据库询问所有键或所有值的列表(唯一的实际操作是readKey,writeKeydeleteKey),因此如果您需要,则必须将其存储在其他位置.另一个缺点是在创建数据库时必须告诉它一个大小.我使用了20M的大小,所以我有足够的空间,但它创建的实际数据库占用了266M.不知道为什么因为没有一行文档.

performance serialization haskell lazy-loading deserialization

5
推荐指数
1
解决办法
146
查看次数

快速,优化的UTF8编码解码

您是否知道使用一些额外信息对UTF8进行编码和解码的最快方法?这是我遇到的有趣案例:

序列化

我只是想编码一个没有验证的不透明缓冲区,所以我可以稍后再解码.最快的是使用底层内存缓冲区,并以某种方式不安全地将它从Text强制转换为ByteString而不触及内容.

可能是ASCII

我想99%的时间我的UTF8实际上是ASCII,因此有必要先做一次确认这一点,如果发现它不是真的那么只进行进一步的处理.

可能不是ASCII

与之前相反.

可能很短

JSON中的单个密钥或数据库,我猜是1到20个字符.愚蠢地支付一些前期成本,如矢量化SIMD方法.

可能很长

一个HTML文档.值得为最高吞吐量支付一些前期成本.

还有一些类似的变体,如编码JSON或URL,你认为可能没有转义字符.

我在[Haskell]标签下提出这个问题,因为Haskell的强类型使得一些技术变得容易,比如C很难实现.此外,可能会有一些特殊的GHC技巧,比如在英特尔平台上使用SSE4指令会很有趣.但这通常是一个UTF8问题,好的想法对任何语言都有帮助.

更新

经过一些研究后,我建议实现encodedecode序列化目的如下:

myEncode :: Text -> ByteString
myEncode = unsafeCoerce
myDecode :: ByteString -> Text
myDecode = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)

如果您喜欢段错,这是一个好主意...

unicode encoding haskell utf-8 ghc

5
推荐指数
1
解决办法
654
查看次数