我想第一次在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) 我偶尔遇到这个问题,最后想问一下是否有一个共同的解决方案或模式. 是否可以在嵌套上下文中引用类型变量引用外部上下文中的类型?例如,
foo :: a -> ... -> ..
foo = ...
where bar :: a -> ...
Run Code Online (Sandbox Code Playgroud)
现在bar和afoo不同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配置文件输出中解码各种成本中心名称的含义.这是该.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_threads内readBuffer),但我不能确定的一些其他元素.并且.\.\.表示嵌套的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(来自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味道很挑剔.
我被焚烧了 …
这是 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) 我希望写一个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构造函数将自身链接到函数,并将其检测为双链接.
谢谢!
如果违反语义规则,使用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) 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) 我有一个令人尴尬的简单问题.
我正在尝试使用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似乎想绝对路径(目录).
如何解决这个问题?
在 OpenGL 中,当我创建窗口时,我隐式地创建了一个带有 GLUT 之类的图形上下文。假设我将窗口拖到由不同显卡驱动的显示器中(例如,一个显卡上有 Intel 嵌入式显卡,另一个显卡上有 NVidia)。 谁渲染窗口?即对于以下每种情况哪个设备运行图形管道。
即使我将窗口完全拖动到一个窗口或另一个窗口中,似乎glGetString(GL_RENDERER)总是返回主显示器(创建 GLUT 窗口的位置)。(我猜这一切都是由初选完成的......)有人可以帮助我理解这一点吗?
请注意,使用 Windows 10、GLUT、OpenGL,但如果重要的话我会问一般性问题。