小编Tim*_*Tim的帖子

在Linux上安装ghc二进制文件(找不到libgmp.so)

我想第一次在Linux上安装Haskell平台(我也是一个相当新的Linux用户).受害者系统是一个全新的Red Hat系统.这里涉及的一切都应该是64位.

平台网站上的指示[1]表明我需要一个ghc7.0.3来提升物品.它们提供了指向ghc-7.0.3的通用二进制文件的链接.我抓住了这个然后跑了

$ ./configure ...
$ make install ...
Run Code Online (Sandbox Code Playgroud)

按照方向没有事件(它是一个二进制文件,所以不需要编译)但是,当我试图运行ghci时,我得到了输出.

$ ghci
GHCi, version 7.0.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... <command line>: can't load .so/.DLL for: gmp (libgmp.so: cannot open shared object file: No such file or directory)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,ghci找不到libgmp.so.运行ghci最终会调用

  /usr/local/lib/ghc-7.0.3/ghc
Run Code Online (Sandbox Code Playgroud)

一堆乱七八糟的选择.我通过ldd检查了依赖项

$ ldd /usr/local/lib/ghc-7.0.3/ghc
    linux-vdso.so.1 =>  (0x00007fffe5f5c000)
    libncursesw.so.5 => /lib64/libncursesw.so.5 (0x0000003ee7000000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003ee5800000)
    libutil.so.1 => /lib64/libutil.so.1 (0x0000003ef3000000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003ee5000000)
    libgmp.so.3 => /usr/lib64/libgmp.so.3 (0x0000003ee4400000)
    libm.so.6 => …
Run Code Online (Sandbox Code Playgroud)

linux installation haskell ghc

27
推荐指数
3
解决办法
2万
查看次数

Haskell引用类型变量

我偶尔遇到这个问题,最后想问一下是否有一个共同的解决方案或模式. 是否可以在嵌套上下文中引用类型变量引用外部上下文中的类型?例如,

foo :: a -> ... -> ..
foo = ...
   where bar :: a -> ...
Run Code Online (Sandbox Code Playgroud)

现在barafoo不同a.通常这是我想要的,但偶尔会让生活变得困难,我需要让它们变得相同.我曾经使用肮脏的技巧迫使类型检查器在过去统一这两个,但偶尔会被挫败.这是我最新的例子(一个Parsec函数),这促使我最终提出这个问题.

data Project = ... deriving Enum
data Stuff = ...

pProject :: Monad m => P m Stuff
pProject = do
  stuff <- pStuff
  ...
  convert stuff <$> pEnum :: P m Project

pEnum :: (Monad m, Enum a) => String -> P m a
pEnum = ...
Run Code Online (Sandbox Code Playgroud)

convert函数需要一个类型,因此我必须指定注释:: P m …

haskell scope type-variables

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

了解Haskell概要分析报告中的成本中心名称

我试图在我的Haskell配置文件输出中解码各种成本中心名称的含义.这是该.prof文件的示例

COST CENTRE                                         MODULE   no. entries  %time %alloc   %time %alloc
  ...
  runSiT.\.\.readBufResults           SiT.SiT       3487     0    0.0      46.3   51.9   
    ...
     ...
     readBuffer.(...)                 SiT.SiT       3540     1    0.0      0.2     0.0    0.2
     readBuffer.tm0_vals              SiT.SiT       3539     1    0.0      0.0     0.0    0.0
     readBuffer.\                     SiT.SiT       3499     0   18.4     12.8    31.0   27.7
     ...
Run Code Online (Sandbox Code Playgroud)

看来,一个点分隔嵌套的成本中心(如readBuffer.n_threads指结合n_threadsreadBuffer),但我不能确定的一些其他元素.并且.\.\.表示嵌套的lambda函数(例如来自类似的东西forM_ ... $ \arg -> do).但是,(...)in 的含义是readBuffer.(...)什么?

编辑: 作为第二个例子,我有:

statsFields.mkStr.\                  Main         3801           4    0.0    0.0     0.0    0.0
 statsFields.fmtModePct …
Run Code Online (Sandbox Code Playgroud)

haskell

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

Haskell将(0/0)设置为qnan

我注意到Haskell(来自Windows上的Haskell平台的ghci 7.10.2)(0/0 :: Double)从我在C++中看到的QNAN标志上翻了一遍(测试了MSVS C++ 2013和cygwin gcc 4.9.2).Haskell 0xfff8000000000000为(0/0)生成位模式(和 - (0/0)生成0x7ff8 ...).这是C++实现的后退似乎.

这是一个测试程序来说明:

import Data.Word
import Unsafe.Coerce
import Text.Printf

dblToBits :: Double -> Word64
dblToBits = unsafeCoerce

test :: Double -> IO ()
test d = putStrLn $ printf "%12f       0x%x" d (dblToBits d)

go = do
  test (0/0)
  test (-(0/0))
  test (1/0)
  test (-(1/0))
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

      NaN       0xfff8000000000000  <- I expect 0x7F...?
      NaN       0x7ff8000000000000  <- I expect 0xFF...?
 Infinity       0x7ff0000000000000
-Infinity       0xfff0000000000000
Run Code Online (Sandbox Code Playgroud)

请注意,无穷大可以正常运行,但NaN似乎翻了.

  • 这是Haskell中NaN未定义语义的一部分吗?即(0/0)意味着ghc可以使用他们想要的任何NaN模式?那么我们在Haskell中有一个精确的方法是在浮点指定QNAN或SNAN而不依赖于特殊的IEEE库4吗?我正在为一块硬件编写一个汇编程序,可能对它的NaN味道很挑剔.

  • 我被焚烧了 …

c++ floating-point haskell ieee-754

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

C++ for-each 语句触发“向量迭代器不兼容”断言失败:this-&gt;_Getcont() == 0

这是 Visual Studio 2012。

static void func(
  ...,
  const std::vector<std::string> &opt_extra_args_strs,
  ...)
{
   // THIS ASSERTS: "vector iterators incompatible"
   for (const std::string &arg_str : opt_extra_args_strs) {
      ... body does not modify opt_extra_args_strs

   // BUT THIS WORKS:
   for (size_t a_ix = 0; a_ix < opt_extra_args_strs.size(); a_ix++) {
       const std::string &arg_str = opt_extra_args_strs[a_ix];
}
Run Code Online (Sandbox Code Playgroud)

我根本没有修改循环体中的向量,事实上,断言发生在第一次迭代之前。该向量在调试器中看起来很正确,但我对 STL 的了解不够,无法查找损坏。在 STL 内部,断言失败来自:

void _Compat(const _Myiter& _Right) const {
    // test for compatible iterator pair
    if (this->_Getcont() == 0 // THIS FAILS (_Getcont() == 0)
         ...) …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

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

在LLVM中向函数添加参数

我希望写一个LLVM传递,即i32类型的两个参数来选择函数.我的第一次尝试(在下面描绘)失败了:

bool MyFunctionPass::runOnFunction(Function &f) 
{
    Type *int32 = Type::getInt32Ty(f.getParent()->getContext());
    Argument *xC = new Argument(int32, "__xC", &f);
    ...
Run Code Online (Sandbox Code Playgroud)

如果我尝试上述操作,模块验证程序会崩溃.新添加的参数类型是垃圾0xCDCDCDCD(未初始化的堆内存).功能类型仍然是:

void (i32 addrspace(1)*, i32 addrspace(1)*, i32)
Run Code Online (Sandbox Code Playgroud)

而不是被新的扩展i32.

此外,将参数直接添加到参数列表Function::getArgumentList()失败,因为Argument构造函数将自身链接到函数,并将其检测为双链接.

  • 我需要一个ModulePass才能做到这一点,或者FunctionPass是否足够?
  • 这样做有一种优雅的方式吗?

谢谢!

llvm llvm-c++-api

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

Parsec:特定位置的错误消息

如果违反语义规则,使用Parsec如何指示特定位置的错误.我知道通常我们不想做这些事情,但请考虑示例语法.

<foo> ::= <bar> | ...
<bar> ::= a positive integer power of two
Run Code Online (Sandbox Code Playgroud)

<bar>规则是一组有限的(我的例子是任意的),和一个纯粹的方式对上述可能是一个细心的的应用程序choice组合子,但是这可能是在空间和时间是不切实际的.在递归下降或工具包生成的解析器中,标准技巧是解析整数(更宽松的语法),然后在语义上检查更难的约束.对于Parsec,我可以使用natural解析器并在fail不匹配时检查结果调用unexpected或者等等.但是,如果我们这样做,默认错误位置是错误的.不知何故,我需要在早期状态引发错误.

我尝试了蛮力解决方案,并写道,采用了组合子getPosition,并setPosition通过所示此非常类似的问题.当然,我也不成功(错误的位置当然是错误的).我已多次遇到这种模式.我正在寻找这种类型的组合器:

withPredicate :: (a -> Bool) -> String -> P a -> P a
withPredicate pred lbl p = do
  ok <- lookAhead $ fmap pred (try p) <|> return False -- peek ahead
  if ok then p         -- consume the input if the value passed the …
Run Code Online (Sandbox Code Playgroud)

haskell parsec

5
推荐指数
2
解决办法
392
查看次数

ghci可以在unsafePerformIO IO块中重新发送IO操作

IO块中的IO操作unsafePerformIO可以重新排序吗?

我有效的IO功能.

assembleInsts :: ... -> IO S.ByteString
assembleInsts ... = do
    tmpInputFile <- generateUniqueTmpFile
    writeFile tmpInputFile str
    (ec,out,err) <- readProcessWithExitCode asm_exe [tmpInputFile] ""
    -- asm generates binary output in tmpOutputFile
    removeFile tmpInputFile
    let tmpOutputFile = replaceExtension tmpIsaFile "bits" -- assembler creates this
    bs <- S.readFile tmpOutputFile -- fails due to tmpOutputFile not existing
    removeFile tmpOutputFile
    return bs
Run Code Online (Sandbox Code Playgroud)

其中S.ByteString是严格的字节字符串.

遗憾的是,我需要在远离IO monad的纯代码树中调用它,但由于我的汇编程序表现为一个引用透明(给定的唯一文件)工具,我想我暂时可以为它做一个不安全的接口暂且.

{-# NOINLINE assembleInstsUnsafe #-}
assembleInstsUnsafe :: ... -> S.ByteString
assembleInstsUnsafe args = unsafePerformIO (assembleInsts args) …
Run Code Online (Sandbox Code Playgroud)

haskell ghci

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

Haskell cabal包括静态库

我有一个令人尴尬的简单问题.

我正在尝试使用mylib.a一个大型C项目的归档库(称之为)(使用GHC的MinGW副本编译).

从顶层我有:

./project.cabal
./src/...haskell..code...
./cbits/interface.c (simplifies access to `lib.a`)
./include/mylib.h
./lib/mylib.a      <<<<<<<<<<<<<<< not sure where to put this or how to reference it
Run Code Online (Sandbox Code Playgroud)

project.cabal既有

c-sources:           cbits/interface.c
include-dirs:        include
Run Code Online (Sandbox Code Playgroud)

extra-lib-dirs似乎想绝对路径(目录).

如何解决这个问题?

haskell ffi cabal

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

具有多个设备(监视器)的 OpenGL 上下文

在 OpenGL 中,当我创建窗口时,我隐式地创建了一个带有 GLUT 之类的图形上下文。假设我将窗口拖到由不同显卡驱动的显示器中(例如,一个显卡上有 Intel 嵌入式显卡,另一个显卡上有 NVidia)。 谁渲染窗口?即对于以下每种情况哪个设备运行图形管道。

即使我将窗口完全拖动到一个窗口或另一个窗口中,似乎glGetString(GL_RENDERER)总是返回主显示器(创建 GLUT 窗口的位置)。(我猜这一切都是由初选完成的......)有人可以帮助我理解这一点吗?

在此输入图像描述

请注意,使用 Windows 10、GLUT、OpenGL,但如果重要的话我会问一般性问题。

windows opengl glut multiple-monitors

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