我有一个问题,一堆monad变压器(甚至一个monad变压器)结束IO.一切都很好,除了在每次动作之前都使用电梯非常烦人!我怀疑这与此无关,但我想我还是会问.
我知道提升整个块,但如果代码实际上是混合类型怎么办?如果GHC投入一些语法糖(例如,<-$= <- lift),这不是很好吗?
在整个网络上,我感觉为编译器编写C后端不再是一个好主意了.GHC的C后端不再被积极开发(这是我不支持的感觉).编译器的目标是C--或LLVM.
通常,我认为GCC是一个很好的老式成熟编译器,在优化代码方面表现很好,因此编译为C将使用GCC的成熟度来产生更好更快的代码.这不是真的吗?
我意识到这个问题在很大程度上取决于所编译语言的性质以及其他因素,以便获得更易于维护的代码.我正在寻找一个更为一般的答案(编译语言),专注于性能(无视代码质量,等等).如果答案包括解释为什么GHC偏离C以及为什么LLVM作为后端表现更好(参见本文)或编译器做任何其他我不了解的编译器的例子,我也会很高兴.
我一直想知道,是什么阻碍了像JVM或PyPy for Haskell这样的高效虚拟机的开发(除了可能的开发工作)?是语言结构吗?我认为难以有效解释的语言(如Python,非常动态)已经拥有了不错的虚拟机.
另外,如果没有什么阻碍这样的实现,那么STG是否是一个很好的目标"字节码",因为所有优化都是在Core上完成的?
是否有讨论此主题的文章或博客文章?
编辑:
runhaskell,但它根本没有效率.我今天注意到这样一个定义
safeDivide x 0 = x
safeDivide = (/)
Run Code Online (Sandbox Code Playgroud)
不可能.我很好奇这背后的(好)原因是什么.必须有一个非常好的(毕竟它是Haskell :)).
注意:我不是在寻找上面代码的替代实现的建议,这是一个简单的例子来证明我的观点.
我想知道是否有一个函数将有理类型转换为Float(Rational a => a - > Float).
我试着用hoogling,却一无所获.
即使在查阅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)
在我看来它是.
我正在尝试构建一个包含无限位图的惰性数据结构.我想支持以下操作:
true :: InfBitMap
返回True的无限位图,即所有位置的值应为True.
falsify :: InfBitMap -> [Int] -> InfBitMap
将列表中的所有位置设置为False.该列表可能是无限的.例如,伪造真[0,2 ..]将返回一个列表,其中所有(且仅)奇数位置为True.
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) 我知道之间的差别data,newtype并type很好.我正在编写一个小脚本,它将构建某种语法树.几乎所有类型都有一个构造函数.我避免type强制执行安全性(多个"不同"类型可能最终在Haskell中具有相同的类型).在这种情况下我不关心懒惰/严格,也不关心性能(这部分绝不是性能关键).我主要专注于风格.我有三个选择:
data.这感觉还可以,除了我有很多类型,只有一个带有一个参数的构造函数.代码看起来有些浪费...虽然我不关心性能提升,但它感觉不对.newtype.在多个参数的情况下,这导致了元组的大量丑陋.data和newtype其中有些看起来不均匀,有点恼人的统一方式.我宁愿所有类型的声明.我选择1到3之间的困境.
我想创建一个简单语言的前端,生成GHC Core.我想接受这个输出并通过正常的GHC管道运行它.根据这个页面,ghc命令无法直接实现.我想知道是否有任何的方式来做到这一点.
我期待最好几个函数调用的GHC-API,但我也很开放,其中包括(不那么广泛)在GHC的源黑客的任何建议.任何指针都会有所帮助!