Happstack Lite打破了我,因为它获得了blaze-html版本0.5,它需要版本0.4.Cabal表示安装了0.4.3.4和0.5.0.0 两个版本.我想删除0.5.0.0并仅使用旧版本.但是cabal没有"卸载"命令,当我尝试时ghc-pkg unregister --force blaze-html,ghc-pkg说我的命令被忽略了.
我该怎么办?
更新:不要相信.虽然ghc-pkg声称忽略该命令,但该命令不会被忽略.在Don Stewart接受的答案中,您可以删除您想要删除的版本.
在我学习Haskell时,我发现在现实代码中使用了很多语言扩展.作为初学者,我应该学会使用它们,还是应该不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性,并且仅将代码限制为几乎GHC.但是,如果我在Hackage上浏览软件包,我发现大多数软件包都是GHC的.
那么,社区对使用语言扩展的态度是什么?
如果扩展的使用是可以的,我如何区分我可以"安全地"使用的扩展(那些可能成为下一个Haskell标准的一部分的扩展)与那些主要是"实验性"的扩展?例如,我认为-XDisambiguateRecordFields很好用,但未来很可能会得到支持吗?
我被告知你可以解释haskell文件(我认为这意味着它们将像Ruby/Python/Perl一样工作).但是,无法在ghc上找到命令行选项来执行此操作.它总是想编译我的文件.看看ghci也是如此,但它总是把我扔进一个repl.
我基本上只想做ghc -i MyFile.hs(其中-i是一个组成的标志,我假装与解释模式相关)并让它执行以便我可以在我尝试创意和学习时获得快速反馈.
我一直在检查integer-gmp源代码,以了解如何根据GHC Primops页面上记录的cmm实现外部primops .我知道使用llvm hack或fvia-C/gcc 实现它们的技术- 这对我来说是理解interger-gmp库使用的第三种方法的更多学习经验.
所以,我抬头一看CMM教程MSFT页(PDF链接),经历了GHC CMM页,仍然存在一些悬而未决的问题(很难保持在头所有这些概念没有挖掘到CMM这就是我现在所做的).这是来自integer-bmp cmm文件的代码片段:
integer_cmm_int2Integerzh (W_ val)
{
W_ s, p; /* to avoid aliasing */
ALLOC_PRIM_N (SIZEOF_StgArrWords + WDS(1), integer_cmm_int2Integerzh, val);
p = Hp - SIZEOF_StgArrWords;
SET_HDR(p, stg_ARR_WORDS_info, CCCS);
StgArrWords_bytes(p) = SIZEOF_W;
/* mpz_set_si is inlined here, makes things simpler */
if (%lt(val,0)) {
s = -1;
Hp(0) = -val;
} else {
if (%gt(val,0)) {
s = 1;
Hp(0) = val; …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
class SymbolSet tpe where
data Symbol tpe :: *
data SSet tpe where
Identity :: tpe -> SSet tpe
And :: SSet tpe -> Symbol tpe -> SSet tpe
class HasElem a b where
instance (SymbolSet tpe) => HasElem (And (Identity tpe) s) s
instance (HasElem sset s) => HasElem (And sset s) s
Run Code Online (Sandbox Code Playgroud)
这是在GHC-7.4中编译的.但是,在转向GHC-7.6时,它开始出现编译错误:
'And' of tpe `forall tpe. tpe -> Symbol * tpe -> SSet tpe' is not promotable
Run Code Online (Sandbox Code Playgroud)
在挖掘文档时,我发现在GHC-7.6与GHC-7.4的 "数据类型升级"页面中添加了一个新的条款
我们不会提升其构造函数是多态的,涉及约束或使用存在量化的数据类型.
我的问题是:
如果你已经购买了函数式编程范例,那么你很可能同时喜欢Erlang和Haskell.两者都具有纯粹的功能核心和其他优点,如轻量级线程,使其非常适合多核世界.但也存在一些差异.
Erlang是一种商业上经过验证的容错语言,具有成熟的分发模型.它具有看似独特的功能,能够通过热代码加载在运行时升级其版本.(太酷了!)
另一方面,Haskell拥有任何主流语言中最复杂的类型系统.(我将'主流'定义为任何已发布的O'Reilly书籍的语言,因此Haskell很重要.)它的直线单线程性能看起来优于Erlang,其轻量级线程看起来更轻.
我正在尝试为我的编码生涯中的其余部分组建一个开发平台,并且想知道是否有可能将Erlang和Haskell混合以实现最佳的平台.这个问题有两个部分:
请回答任何经验(积极或消极),想法或建议.事实上,任何反馈(没有直接滥用!)都是受欢迎的.
更新
感谢迄今为止的所有4个回复 - 每个回复教我至少一个我不知道的有用的东西.
关于其余的编码生活事物 - 我把它略微舌头放在脸颊上引发争论,但实际上是真的.我有一个项目,我打算继续工作直到我死,它需要一个稳定的平台.
在我上面提到的平台中,我只会编写Haskell,因为将自动生成样板Erlang.那么Haskell会持续多久?好吧Lisp仍然和我们在一起,看起来不会很快消失.Haskell是BSD3的开源软件,已达到临界质量.如果编程本身在50年左右仍然存在,我预计Haskell或者Haskell的一些不断演变仍将存在.
更新2 以回应rvirding的帖子
同意 - 实现一个完整的"Erskell/Haslang"通用虚拟机可能并非绝对不可能,但确实非常困难.尽管如此,将垃圾收集器级别作为VM之类的东西共享虽然仍然很难,但听起来要小一些.在垃圾收集模型中,函数式语言必须有许多共同点 - 不可变数据(包括thunk)的无处不在和非常快速分配的要求.因此,将通用性与单片VM紧密捆绑在一起这一事实似乎有些奇怪.
虚拟机确实有助于达到临界质量.看看像F#和Scala这样的"精简"功能语言是如何起飞的.Scala可能没有Erlang的绝对容错能力,但它为许多与JVM绑定的人提供了一条逃生路线.
虽然拥有单个堆会使消息传递速度非常快,但它会引入许多其他问题,主要是因为它必须是交互式且全局不中断的,因此GC变得更加困难,因此您无法使用相同的简单算法.进程堆模型.
当然,这对我来说非常有意义.GHC开发团队中非常聪明的人似乎试图通过平行的"停止世界"GC来解决部分问题.
http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf
(显然,"停止世界"不会因为它的主要用例而对一般的Erlang飞行.)但即使在"停止世界"的用例中也是如此,它们的加速似乎并不普遍.所以我同意你的观点,不太可能有一个普遍最好的GC,这就是我在我的问题第1部分中指出的原因.
GHC运行时可以配置为仅使用一个核心,或本地计算机上的所有核心,或其间的任何组合.
通过这种方式,对于给定的用例,我可以在基准测试后选择使用Erlang方式,并运行一个GHC运行时(使用单线程GC)和每个核心一个Erlang进程,让Erlang在内核之间复制内存以获得良好的局部性.
或者,在处理器上具有4个核心/处理器且具有良好内存带宽的双处理器计算机上,基准测试可能表明我运行一个GHC运行时(使用并行GC)以及每个处理器一个Erlang进程.
在这两种情况下,如果Erlang和GHC可以共享一个堆,那么共享可能会被绑定到以某种方式在单个核上运行的单个OS线程.(我在这里深入了解,这就是我提出这个问题的原因.)
我还有另一个议程 - 独立于GC的功能语言基准测试.我经常读到OCaml v GHC v Erlang v ...的基准测试结果,并想知道不同的GC会对结果造成多大的影响.如果选择GC可以与功能语言的选择正交怎么办?GC究竟有多昂贵?看到这个恶魔倡导者的博文
http://john.freml.in/garbage-collection-harmful
由我的Lisp朋友约翰弗雷姆林,他迷人地,给他的帖子标题"自动垃圾收集是垃圾".当John声称GC很慢并且没有真正加速那么多时,我希望能够用一些数字来对抗.
erlang garbage-collection haskell functional-programming ghc
我读到Haskell中的哈希表存在性能问题(2006 年的Haskell-Cafe和2009年的Flying Frog Consultancy的博客),因为我喜欢Haskell,所以我很担心.
那是一年前,现在的状况是什么(2010年6月)?GHC中是否修复了"哈希表问题"?
我很迷惑.我尝试使用print,但我知道人们适用putStrLn.它们之间有什么真正的区别?
print $ function
putStrLn $ function
Run Code Online (Sandbox Code Playgroud) 在Haskell中进行编程时(特别是在解决Project Euler问题时,其中次优解决方案往往会对CPU或内存需求造成压力)我经常感到困惑,为什么程序的行为方式如此.我看一下配置文件,尝试引入一些严格,选择另一种数据结构,...但主要是它在黑暗中摸索,因为我缺乏良好的直觉.
此外,虽然我知道如何实现Lisp,Prolog和命令式语言,但我不知道实现一种懒惰的语言.我也有点好奇.
因此,我想了解更多关于从程序源到执行模型的整个链.
我想知道的事情:
应用了哪些典型的优化?
当有多个评估候选者时,执行顺序是什么(虽然我知道它是从所需的输出驱动的,但是在首先评估A然后B之后可能仍然存在很大的性能差异,或者首先评估B以检测到您不需要一点都不)
thunk如何代表?
如何使用堆栈和堆?
什么是CAF?(分析表明有时热点在那里,但我没有线索)
GHC如何处理多个线程(显式线程或评估spark的内部线程)访问的thunk?是否会发生多个线程评估同一个thunk,重复工作?或者,如果thunks同步,如何,这样性能不会受到影响?
ghc ×10
haskell ×10
cabal ×1
constructor ×1
erlang ×1
ghci ×1
hashtable ×1
heap-memory ×1
optimization ×1
printing ×1
thunk ×1