小编ael*_*ndy的帖子

绑定FFI和DSL

在Haskell LLVM绑定中,我试图定义一个带有可变数量参数的函数(实际上我的意思是在编译时不知道的常数).我发现了这个问题,我试图按照答案.

我不想完全回退使用FFI来生成LLVM,我想尽可能多地使用DSL并使用FFI来做我不能通过DSL做的事情.

我设法通过functionType定义一个类型,我仍然无法将函数添加到通过调用创建的模块defineModule.我还认为下一步是将基本块添加到FFI.appendBasicBlock我认为很容易的函数中,但是如何通过monad FFI.getParam中的do块内部获取参数CodeGenFunction.

haskell llvm

54
推荐指数
1
解决办法
990
查看次数

使用monad变压器避免升力

我有一个问题,一堆monad变压器(甚至一个monad变压器)结束IO.一切都很好,除了在每次动作之前都使用电梯非常烦人!我怀疑这与此无关,但我想我还是会问.

我知道提升整个块,但如果代码实际上是混合类型怎么办?如果GHC投入一些语法糖(例如,<-$= <- lift),这不是很好吗?

monads haskell monad-transformers

49
推荐指数
2
解决办法
8155
查看次数

将语言编译为C是一个好主意吗?

在整个网络上,我感觉为编译器编写C后端不再是一个好主意了.GHC的C后端不再被积极开发(这是我不支持的感觉).编译器的目标是C--或LLVM.

通常,我认为GCC是一个很好的老式成熟编译器,在优化代码方面表现很好,因此编译为C将使用GCC的成熟度来产生更好更快的代码.这不是真的吗?

我意识到这个问题在很大程度上取决于所编译语言的性质以及其他因素,以便获得更易于维护的代码.我正在寻找一个更为一般的答案(编译语言),专注于性能(无视代码质量,等等).如果答案包括解释为什么GHC偏离C以及为什么LLVM作为后端表现更好(参见本文)或编译器做任何其他我不了解的编译器的例子,我也会很高兴.

c compiler-construction gcc ghc

43
推荐指数
7
解决办法
4819
查看次数

什么阻止了有效的Haskell虚拟机(如JVM)?

我一直想知道,是什么阻碍了像JVM或PyPy for Haskell这样的高效虚拟机的开发(除了可能的开发工作)?是语言结构吗?我认为难以有效解释的语言(如Python,非常动态)已经拥有了不错的虚拟机.

另外,如果没有什么阻碍这样的实现,那么STG是否是一个很好的目标"字节码",因为所有优化都是在Core上完成的?

是否有讨论此主题的文章或博客文章?

编辑:

  • 我知道HaLVM,但我认为这不是我的意思.
  • 我也知道runhaskell,但它根本没有效率.

haskell jvm vm-implementation

27
推荐指数
4
解决办法
4620
查看次数

通过具有不同参数数量的方程定义函数

我今天注意到这样一个定义

safeDivide x 0 = x
safeDivide = (/)
Run Code Online (Sandbox Code Playgroud)

不可能.我很好奇这背后的(好)原因是什么.必须有一个非常好的(毕竟它是Haskell :)).

注意:我不是在寻找上面代码的替代实现的建议,这是一个简单的例子来证明我的观点.

haskell

26
推荐指数
3
解决办法
3012
查看次数

在Haskell没有toFloat

我想知道是否有一个函数将有理类型转换为Float(Rational a => a - > Float).

我试着用hoogling,却一无所获.

haskell

14
推荐指数
1
解决办法
2194
查看次数

绑定到参数和返回值const引用的C++临时对象

即使在查阅SO上的相关问题并阅读C++ 03标准页面192(http://cs.nyu.edu/courses/fall11/CSCI-GA.2110)之后,我也无法清楚地知道这是否合法.-003/documents/c ++ 2003std.pdf).这是合法和安全的:

const MyClass& f(const MyClass& arg) {
  return arg;
}

void some_other_function() {
  const MyClass& reference = f(MyClass());
  // Use reference.
}
Run Code Online (Sandbox Code Playgroud)

在我看来它是.

c++

14
推荐指数
2
解决办法
1390
查看次数

无限懒惰的位图

我正在尝试构建一个包含无限位图的惰性数据结构.我想支持以下操作:

  1. true :: InfBitMap

    返回True的无限位图,即所有位置的值应为True.

  2. falsify :: InfBitMap -> [Int] -> InfBitMap

    将列表中的所有位置设置为False.该列表可能是无限的.例如,伪造真[0,2 ..]将返回一个列表,其中所有(且仅)奇数位置为True.

  3. check :: InfBitMap -> Int -> Bool

    检查索引的值.

这是我到目前为止所能做的.

-- InfBitMap will look like [(@), (@, @), (@, @, @, @)..]
type InfBitMap = [Seq Bool]

true :: InfBitMap
true = iterate (\x -> x >< x) $ singleton True

-- O(L * log N) where N is the biggest index in the list checked for later
-- and L is the length of the index …
Run Code Online (Sandbox Code Playgroud)

haskell data-structures

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

又一个新类型与数据(风格问题)

我知道之间的差别data,newtypetype很好.我正在编写一个小脚本,它将构建某种语法树.几乎所有类型都有一个构造函数.我避免type强制执行安全性(多个"不同"类型可能最终在Haskell中具有相同的类型).在这种情况下我不关心懒惰/严格,也不关心性能(这部分绝不是性能关键).我主要专注于风格.我有三个选择:

  1. 仅限使用data.这感觉还可以,除了我有很多类型,只有一个带有一个参数的构造函数.代码看起来有些浪费...虽然我不关心性能提升,但它感觉不对.
  2. 仅限使用newtype.在多个参数的情况下,这导致了元组的大量丑陋.
  3. 混合datanewtype其中有些看起来不均匀,有点恼人的统一方式.我宁愿所有类型的声明.

我选择1到3之间的困境.

haskell coding-style

8
推荐指数
2
解决办法
418
查看次数

编译为GHC Core

我想创建一个简单语言的前端,生成GHC Core.我想接受这个输出并通过正常的GHC管道运行它.根据这个页面,ghc命令无法直接实现.我想知道是否有任何的方式来做到这一点.

我期待最好几个函数调用的GHC-API,但我也很开放,其中包括(不那么广泛)在GHC的源黑客的任何建议.任何指针都会有所帮助!

haskell ghc ghc-api

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