• 根据复杂的Haskell类型生成C结构
    我试图在我的c代码中使用haskell库。我尝试使用的haskell函数的类型是String -> IO [Reference],其中Reference是一个相当复杂的结构(请参见here for details)。在阅读各种文档的基础上,似乎我必须使这种类型成为Storable的实例,并且在我的c代码中定义了一个类似的结构才能访问它。对于这样一个复杂的类型来说,这似乎是很多非常重复的工作。有没有办法使之自动化?这样的事怎么办?最佳答案:这取决于您的实际用例,但是…可以更容易地将Reference导出为不透...
  • Haskell FFI-如何处理接受或返回结构而不是结构指针的C函数?
    当然,答案是以某种方式传递/获取一个连续的内存块,所以问题更多的是如何做到这一点。目前,我仍然可以通过在C端编写包装器函数来避免这个问题,但这并不是一个很好的解决方案。最佳答案:ffi不支持任意传递值haskell可存储类型。您只能传递类型为的值(其中一些是指针):Int#, Word#, Char#, Float#, Double#, Addr#, StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#. 因此,要传递结构,必须通过c包装器...
  • 如何选择合适的Haskell C型?
    我研究过一些haskell编程语言,现在发现可以从c程序调用haskell函数。在我的haskell研究中,我用haskell创建了一个单词频率计数器,我想试着从c程序调用这个函数,但是我不知道怎么做。我在haskell.org上找到了这两个网站:Calling Haskell from CForeign C types (Haskell module)尽管如此,我还是有点不知道该使用哪种类型。我的haskell程序是由以下函数组成的管道:普斯特尔。不亮。地图测试。分类树我自己的职责testf是testf的...
  • 用Haskell写二进制数据以供C读取吗?
    我有一个包含由data.binary序列化的[Double]的文件,我想用c来读取它。也就是说,我想编写一个c程序,将数据作为double[]读入内存。我正计划编写一个haskell程序来反序列化数据文件,然后将二进制数据写入一个新的更简单的文件,我可以直接读取到c中,但我不确定如何只写出原始二进制数据(例如,一个double需要8字节)。最佳答案:使用Data.Binary序列化Double或Float值对可移植性不是很好。Binary实例以decodeFloat获得的形式序列化值,即作为尾数和指数。尾数...
  • 在运行时从Haskell调用C函数
    我正在为haskell中的动态编程语言构建一个解释器。我想添加一个调用c函数的简单机制。在过去,我使用haskell ffi调用我显式声明了名称和类型的c函数;这种方法在这里不起作用,因为解释器直到运行时才知道要调用的c函数的名称或类型。是否可以在运行时声明和调用c函数?我应该从哪里开始?最佳答案:动态导入如果您可以列出所有可能被调用的c函数的类型,那么您可以使用ffi的动态导入功能(http://www.haskell.org/onlinereport/haskell2010/haskellch8.htm...
  • 是否可以在运行时生成并运行TemplateHaskell生成的代码?
    是否可以在运行时生成并运行templatehaskell生成的代码?使用c,在运行时,我可以:创建函数的源代码,调用gcc将其编译为.so(linux)(或使用llvm等),加载.so和调用函数。模板haskell也有类似的功能吗?最佳答案:是的,有可能。ghc api将编译模板haskell。概念证明可在https://github.com/JohnLato/meta-th获得,虽然不是很复杂,但它显示了一种通用技术,甚至提供了一点类型安全性。模板haskell表达式使用Meta类型构建,然后可以编译并加...
  • 如何将字符串从Haskell传递给C?
    我只想把一个纯文本字符串从haskell传递给c,但是它说[char]是一个不可接受的返回类型。我找不到他们认为是什么原因,也找不到什么可接受的返回类型。我正在尝试制作一个非常简单的操作系统映像,我可以用qemu引导它。有人知道怎么做吗?谢谢。 {-# LANGUAGE ForeignFunctionInterface #-} module Hello where import Foreign import Foreign.C.String import Forei...
  • Haskell:使用对变量的最后引用来有效创建新变量
    此C代码在概念上可以描述为创建与输入数组相同的新数组,但第一个元素是1:int* retire_and_update(int* arr) { arr[0] = 1; return arr; } 这是一个纯函数(wink wink nudge nudge),只要不再引用输入数组及其元素。C型系统不会强制我们这样做,但它在原则上似乎是可以强制执行的。gcc生成的代码简单高效:retire_and_update: movq %rdi, %rax movl $1, (%r...
  • pthread_cond_timedwait在GHC FFI中不返回
    我试图实现haskellControl.Concurrent.MVar,它驻留在共享内存中,并允许使用posix功能在多个独立进程/程序之间进行通信。但我失败了,很多死锁。问题是,pthread_cond_timedwait有时在ghc ffi中不返回被调用(尽管interruptible或unsafe)。在绝望地试图解决这个问题几天后,我决定缩小代码并请求社区帮助。不幸的是,我无法将这个问题浓缩成几行代码。因此,我在github上存储了(尽可能小的)代码,以及如何将问题here is a permalin...
  • 使用C和Haskell的项目的构建系统
    我正在做一个使用c和haskell的项目。目前,我正在使用cmake构建一个c共享库,而cabal构建一个haskell可执行文件。有没有更统一的方法来做这件事?我可以从cmake生成的makefile调用cabal吗?或者有没有办法直接从cabal构建c库?谢谢。最佳答案:cmake也可以做你想做的事。不过,它确实复制了很多阴谋集团的功能。因此,您可以从您选择使用的任何构建工具(对于cmake,使用自定义命令,对于makefiles,这非常简单)调用cabal,直接构建二进制文件(请参见cabal bui...
  • sqrt,完美平方和浮点错误
    在大多数语言的sqrt函数中(尽管这里我对c和haskell最感兴趣),是否有任何保证一个完美平方的平方根将被精确地返回?例如,如果我执行sqrt(81.0) == 9.0,是否安全,或者sqrt是否有可能返回8.99999998或9.00000003?如果不能保证数值精度,那么检查一个数字是否是完美正方形的首选方法是什么?取平方根,得到地板和天花板,确保它们回到原来的数字?谢谢您!最佳答案:在ieee 754浮点中,如果双精度值x是非负可表示数y的平方(即y*y==x,且y*y的计算不涉及任何舍入、溢出或...
  • 从C调用Haskell FFI函数Ptrs
    我正在尝试使用以下代码:sample_hs :: CInt -> (CInt -> CInt) sample_hs x = (x+) foreign export ccall sample_hs :: CInt -> (CInt -> CInt) 我想用C语言做这样的事情:pf = sample_hs(2); result = pf(3); //Should be 5; 但是,当我尝试执行此操作时,会收到一条错误消息:错误:函数“sample”的参数太少我猜这门语言之间的接口并不像我想象的那样工作。有办法...
  • Haskell和C比较速度进行质数计算
    我最初写了这个计算素数的方法(蛮力和低效),目的是确保使用“if then else”和haskell中的警卫在速度上没有区别(没有区别!)。但后来我决定写一个C程序来比较,我得到了以下结果(Haskell的速度慢了25%多一点):(注意,我从下面的文章中得到了使用rem而不是mod的想法,以及编译器调用中的o3选项:On improving Haskell's performance compared to C in fibonacci micro-benchmark)哈斯克尔:forum.hsdivis...
  • GHC运行时如何处理文件I / O?
    一些关于ghc运行时内部的文章提到,它使用epoll/kqueue/poll来检测文件描述符是否准备好读/写。我能理解socket i/o是如何实现的,但是磁盘文件访问呢?poll syscall不能处理普通文件,只能处理socket i/o;true?我能想象的唯一的选择是使用一个线程池来阻止系统调用,每个请求一个线程…最佳答案:在无线程的rts中,整个运行时将阻塞。在线程rts中,它将通过线程池执行这样的安全外部调用,因此功能不会阻塞。
  • 如何在C中提升功能以获取额外的参数?
    (我理解C不是以功能性的方式使用的。然而,在学习了函数式编程之后,我很难有不同的想法。)鉴于这些限制:没有嵌套函数,因为clang禁止它(所以没有lamda表达式)没有全局变量我们能想出一种方法来提升函数f以获得一个额外的参数来适应原型吗?比如,在执行f时,这个新参数将被忽略?下面是我想做的详细内容:我想要一个函数f,它的类型是:f :: void f(char *s) 在以函数作为参数(称为参数)的函数g中,其类型为:arg :: void f(unsigned int i, char *s) 因此,g的...
  • 学习Haskell:C#中的列表理解
    下面的代码在haskell中。我该如何在C_中编写类似的函数?squareArea xs = [pi * r^2 | r <- xs] 只是为了澄清…上面的代码是一个函数,它接受包含圆半径的列表作为输入。表达式计算输入列表中每个圆的面积。我知道在c_中,通过循环遍历一个列表并计算列表中每个圆的面积并返回一个包含圆面积的列表,我可以获得相同的结果。我的问题是…上面的代码可以用C语言以类似的方式编写吗?也许可以使用lambda表达式或LINQ?最佳答案:使用Enumerable:IEnumerable<doub...
  • 禁止现有类的接口实现是否有任何优势?
    在静态oop语言中,使用接口来声明几个类共享一些逻辑属性-它们是可丢弃的,可以与int进行比较,可以序列化,等等。假设.net没有标准的IDisposable接口,我刚刚想出了一个漂亮的主意:interface IDiscardable { void Discard(); } 我的应用程序使用了很多System.Windows.Forms,我认为aForm满足了成为IDiscardable的逻辑要求。问题是,Form是在我的项目之外定义的,所以C#(和Java,C++…)不允许我为它实现IDiscardab...
加载中...
公众号