该文件规定:
函数f上的{ - #INLINABLE f# - } pragma具有以下行为:
虽然INLINE说"请内联我",INLINABLE说"请随意内联我;请自行决定".换句话说,选择留给GHC,它使用与无编译指示函数相同的规则.与INLINE不同,该决定是在呼叫站点进行的,因此会受到内联阈值,优化级别等因素的影响.
与INLINE类似,INLINABLE pragma保留原始RHS的副本以用于内联,并且无论RHS的大小如何,都将其保留在接口文件中.
使用INLINABLE的一种方法是结合内联特殊函数(第7.18节"特殊内置函数").调用内联f非常难以内联f.为了确保f可以内联,最好将f的定义标记为INLINABLE,以便GHC保证在不管它有多大的情况下展开展开.此外,通过将f注释为INLINABLE,可以确保f的原始RHS内联,而不是f GHC优化器产生的任何随机优化版本.
INLINABLE pragma也适用于SPECIALIZE:如果将函数f标记为INLINABLE,那么随后可以在另一个模块中进行SPECIALIZE(参见第7.16.8节"SPECIALIZE pragma").
与INLINE不同,可以在递归函数上使用INLINABLE编译指示.主要原因是允许以后使用SPECIALIZE
它的缺点是什么?
它是否使界面文件更大,更大?它是否使编译速度慢得多?
有没有理由我不应该在我写的每个导出函数上放置一个INLINABLE pragma?是否有任何理由GHC没有在我写的每个导出函数上放置一个INLINABLE pragma?
在整个网络上,我感觉为编译器编写C后端不再是一个好主意了.GHC的C后端不再被积极开发(这是我不支持的感觉).编译器的目标是C--或LLVM.
通常,我认为GCC是一个很好的老式成熟编译器,在优化代码方面表现很好,因此编译为C将使用GCC的成熟度来产生更好更快的代码.这不是真的吗?
我意识到这个问题在很大程度上取决于所编译语言的性质以及其他因素,以便获得更易于维护的代码.我正在寻找一个更为一般的答案(编译语言),专注于性能(无视代码质量,等等).如果答案包括解释为什么GHC偏离C以及为什么LLVM作为后端表现更好(参见本文)或编译器做任何其他我不了解的编译器的例子,我也会很高兴.
我正常做着"读睡前LYAH的一章"的例行公事,感觉我的大脑正随着每个代码样本而扩展.在这一点上,我确信我理解了Haskell的核心功能,现在只需要理解标准库和类型类,这样我就可以开始编写真正的软件了.
所以我正在阅读有关应用函子的章节,突然之间,本书声称函数不仅仅有类型,它们是类型,并且可以这样处理(例如,通过使它们成为类型类的实例).( - >)是一个类似于任何其他类型的构造函数.
我的思绪又被吹了,我立刻跳下床,启动计算机,去了GHCi并发现了以下内容:
Prelude> :k (->)
(->) :: ?? -> ? -> *
Run Code Online (Sandbox Code Playgroud)
data (->) ... = ... | ... | ...格式定义它.使用任何其他类型的构造函数都可以轻松完成:data Either a b = Left a | Right b.我怀疑我无法以这种形式表达它与极端奇怪的类型签名有关.* -> * -> *.想一想......( - >)也会出现在亲切的签名中!这是否意味着它不仅是一个类型构造函数,而且还是一种类型的构造函数?这与类型签名中的问号有关吗?我已经阅读了某个地方(希望我能再次找到它,谷歌让我失望)关于能够通过从值,值类型,到各种类型,各种类型,到其他各种类型,任意扩展类型系统,到别的东西,等等永远.这是否反映在( - >)的签名中?因为我也遇到了Lambda多维数据集的概念和构造的微积分而没有花时间去真正研究它们,如果我没记错,可以定义采用类型和返回类型的函数,取值和返回值,获取类型和返回值,并获取返回类型的值.
如果我不得不猜测一个带有值并返回一个类型的函数的类型签名,我可能会这样表达:
a -> ?
Run Code Online (Sandbox Code Playgroud)
或者可能
a -> *
Run Code Online (Sandbox Code Playgroud)
虽然我没有看到根本不可变的原因,为什么第二个例子不能轻易地被解释为从类型a的值到类型*的值的函数,其中*只是字符串或类似的类型同义词.
第一个例子更好地表达了一个函数,它的类型在我的脑海中超越了一个类型签名:"一个函数,它接受一个类型为a的值并返回一些不能表示为类型的东西."
我正在尝试从Haskell源代码创建一个共享库.
我试过按照这里的说明:http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/但我没有运气.
当我使用Haskell 64位(2011.4.0.0中的ghc 7.0.4)编译时,我收到以下错误:
ld: pointer in read-only segment not allowed in slidable image, used in
___gmpn_modexact_1c_odd
Run Code Online (Sandbox Code Playgroud)
作为替代方案,我也尝试了32位版本,并根据我用来链接获取错误的确切标志,例如:
Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib
Run Code Online (Sandbox Code Playgroud)
通过将-lHSrts添加到链接器行,我确实设法得到了更多.这让我成功地链接和加载库,但我无法使用dlsym找到函数名称(或者手动使用nm | grep)
任何提示将不胜感激,一个示例生成文件,或成功构建(和使用)OS X上的共享库的构建行将不胜感激.我对Haskell很新,并且不知道我是否应该继续敲打我的脑袋,假设问题出现在我的最后,或者出于各种原因我不应该期望这在OS X上工作.
我尝试过的所有组合的git repo都可以在这里找到:https://github.com/bennoleslie/haskell-shared-example我确实设法为32位ghc工作,但不是64位.
我想在Haskell项目中使用外部库RDFox.
上下文:我使用GHC 7.10和堆栈在64位上运行Windows和Linux .RDFox是用C++编程的.可以使用Java和Python包装器下载RDFox共享库(.dll,.so).
目的:我想在我的Haskell项目中重用RDFox(.dll,.so)中的编译库,因此我需要为RDFox创建一个Haskell包装器.
问题:对于Haskell来说相对较新,我很难知道从哪里开始.我找到了几个关于这个主题的页面(来自Haskell wiki和StackOverflow),但工作流程和配置对我来说并不清楚.
问题:我想知道:
- 如何配置堆栈和cabal以使用外部库,在Windows 或 Linux(不同的机器,相同的存储库)上构建.
- 如何在此外部库上配置GHCi以进行交互式测试.
- 将Python包装器转换为Haskell是最好的方法吗?我想避免分析RDFox C++代码.
我只是好奇Haskell中列表的一些确切的实现细节(GHC特定的答案很好) - 他们是天真的链接列表,还是他们有任何特殊的优化?进一步来说:
length和(!!)(例如)必须遍历列表?length两次,它是否必须迭代两次)?fib = 1:1:zipWith (+) fib (tail fib),是否会递归计算每个值,还是依赖于先前的计算值?)任何其他有趣的实施细节将不胜感激.提前致谢!
在本演示文稿的第30/78页幻灯片中,Simon建议类型类的实现在开始时是一种"绝望".有谁知道那是为什么?
GHC的设计基于一种名为STG的东西,它代表"无骨架,无标签G机".
现在G-machine显然是"图形缩减机"的缩写,它定义了如何实现懒惰.未评估的thunk被存储为表达式树,并且执行该程序涉及将这些减少到正常形式.(树是非循环图,但Haskell的普遍递归意味着Haskell表达式形成一般图,因此图减少而不是树减少.)
不太清楚的是术语"无骨"和"无标记".
我认为 "无脊椎"指的是功能应用程序没有功能应用程序节点的"脊椎"这一事实.相反,您有一个对象,该对象命名所调用的函数并指向其所有参数.那是对的吗?
我认为"无标签"指的是构造函数节点没有用构造函数ID"标记",而是使用跳转指令解析case-expression.但现在我不确定这是否正确.相反,它似乎指的是节点没有用其评估状态标记的事实.谁能澄清这些解释中哪些(如果有的话)是正确的?
有没有什么好方法可以制作小的haskell可执行文件?使用ghc6,一个简单的hello world程序似乎达到了370kB(在strip之前为523kB).C中的Hello世界大约是4kB(剥离前9kB).
如您所知,Template Haskell用于在编译时以编程方式生成各种AST拼接.
然而,拼接通常可能非常不透明,并且通常难以辨别拼接实际生成的内容.如果你运行Qmonad进行拼接,并且拼接是良好类型的,你可以很好地show表示生成的AST片段,但由于其非结构化布局,这种表示很难理解.
将TH生成的AST转换为类似于普通Haskell代码的首选方法是什么,以便可以轻松读取和理解代码?可以从例如给定Dec值重建源代码吗?是否必须阅读GHC核心代码?有没有办法至少构建AST,使其变得更具可读性(超出pretty-show包裹的范围)?
ghc ×10
haskell ×9
bytecode ×1
c ×1
cabal ×1
compilation ×1
gcc ×1
inline ×1
linked-list ×1
linker ×1
macos ×1
pragma ×1
pretty-print ×1
type-systems ×1
typeclass ×1
types ×1