我们发现这个函数构建器实现了P.Graham的"ANSI Common Lisp"(第110页)中的组合.参数是n> 0引用的函数名称.我完全不明白,所以我会在这里引用代码并在其下面指出我的问题:
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
Run Code Online (Sandbox Code Playgroud)
要构成的参数列表是反向和解包的,其(现在是第一个)元素绑定到'fn1',其余元素绑定到'rest'.最外层lambda的主体是reduce :( funcall fi(funcall fi-1 ...)),操作数按反转顺序恢复初始值.
1)最外层lambda表达式的作用是什么?也就是说,它从哪里获得'args'?它是指定为destructuring-bind的第一个参数的数据结构吗?2)最里面的lambda从哪里取两个参数?
我的意思是我可以欣赏代码的作用但是词法范围对我来说仍然有点神秘.期待任何和所有评论!在此先感谢,Marco
我想了解简单的算术表达式是如何编译到 GHC 9.0.1 Core 中的
为此,我隔离了相同的声明,
f = \x y -> sqrt x + y
Run Code Online (Sandbox Code Playgroud)
并将其编译为两种不同的类型:
f :: Double -> Double -> Double
f :: Floating a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
导致这些非常不同的野兽:
\ (x [Dmd=<S,1*U(U)>] :: Double) (y [Dmd=<S,1*U(U)>] :: Double) ->
case x of { D# x ->
case y of { D# y -> D# (+## (sqrtDouble# x) y) }
}
Run Code Online (Sandbox Code Playgroud)
在单态情况下和
\ (@a)
($dFloating_a22t [Dmd=<S(S(S(C(C(S))LLLLLL)LLL)LLLLLLLLLLLLLLLLLLLLLL),U(1*U(1*U(1*C1(C1(U)),A,A,A,A,A,A),A,A,A),A,A,A,1*C1(U),A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A)>]
:: Floating a)
(eta_B0 :: a)
(eta_B1 :: a) -> …Run Code Online (Sandbox Code Playgroud) 我正在编写一个GHC 核心插件,它最终会向它调用的模块添加新的函数声明。
目前我正在努力结合核心助手来生成Expr与 lambda 函数对应的函数。
例如,假设我们要合成术语\(x :: Double) -> x + x。
如果我们看一下印刷精美的 Core :
f \ (x [Dmd=<S,U(U)>] :: Double) -> plusDouble x x
Run Code Online (Sandbox Code Playgroud)
将该术语的 AST 复制到一个有Show能力的 AST 后,我们可以看到它的 lambda 抽象和函数应用程序的结构,我的目标是使用 Core 组合器手动复制:
DLam "x::Double"
(DApp
(DApp (DVar "plusDouble::Double -> Double -> Double") (DVar "x::Double")) (DVar "x::Double"))
Run Code Online (Sandbox Code Playgroud)
长话短说,我无法综合该术语 L0L。
我生成了一个看起来正确的术语 (?),GHC 在我的新术语中拼接后没有错误地完成,具有新声明的模块正确加载,但当我尝试使用它时 GHCi 崩溃。
我的问题:
DEFAULT) 案例?我怀疑它们是由于我的使用方式mkCoreAppsDouble而不是原始的Double#?新声明的 GHCi 签名:
PluginTest.f_new :: …Run Code Online (Sandbox Code Playgroud) AC枚举类型由c2hs呈现到Haskell中,完成Storable正确编译的实例(TypesC2Hs.chs).我将这个不合格的导入到我为inline-ccontext(Internal.hs)指定的模块中..hs由c2hs生成的模块和Internal.hs导入的模块,InlineC.hs另一个inline-c模块包含C调用的quasiquotes.
TypesC2Hs.hs -------------
| |
V V
Internal.hs -------> InlineC.hs
Run Code Online (Sandbox Code Playgroud)
InlineC.hs 抱怨这种类型无法编组:"外国声明中不可接受的参数类型:'DMBoundaryType'无法在外部调用中编组时检查声明:"
到底是怎么回事?这是第一次inline-c给我这个错误的类型.
我应该注意,其他类型不需要直接解除引用,例如newtype DM = DM (Ptr DM) deriving Storable,使用上述方法可以正常工作.
提前致谢
TypesC2Hs.chs
{# enum DMBoundaryType as DMBoundaryType {underscoreToCase} deriving (Eq, Show) #}
instance Storable DMBoundaryType where
sizeOf _ = {# sizeof DMBoundaryType #}
alignment _ = {# alignof DMBoundaryType #}
peek = peek
poke = poke
Run Code Online (Sandbox Code Playgroud)
Internal.hs …
我构建并运行以下最小示例(无外部依赖项)
C->Haskell Compiler, version 0.25.2 Snowboundest, 31 Oct 2014
build platform is "x86_64-darwin" <1, True, True, 1>; 构建命令:
c2hs Structs.chs
ghci Structs.hs
Run Code Online (Sandbox Code Playgroud)
但链接器抱怨了
During interactive linking, GHCi couldn't find the following symbol: get_foo
Run Code Online (Sandbox Code Playgroud)
问:为什么会这样,我该如何解决?Thx提前
答:tl; dr:我没有将.c编译成.o目标代码,DUH!
代码如下:
Structs.chs
module Main where
import Foreign
import Foreign.C
#include "Structs.h"
{#pointer *foo as Foo#}
{#fun get_foo {`Int'} -> `Foo' return* #}
main :: IO ()
main = do
foo <- get_foo 3
a1 <- {#get struct foo->a#} foo
print a1
Run Code Online (Sandbox Code Playgroud)
Structs.h
struct …Run Code Online (Sandbox Code Playgroud) 我想在C函数中包装一个类似函数的C宏(然后用一个{#fun ... #}块将它包装在Haskell中),但是c2hs预处理器会在do.. while(0)语法上扼杀; 这是代码:
module TestMacro where
#c
#define TestF1(n) do{if n==0 return 0;else return 1; } while(0)
int c_testF1(int x)
{ return ( TestF1(x) ); }
#endc
Run Code Online (Sandbox Code Playgroud)
这是错误:
c2hs TestMacro.chs
c2hs: C header contains errors:
TestMacro.chs.h:6: (column 12) [ERROR] >>> Syntax error !
The symbol `do' does not fit here.
make: *** [main] Error 1
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我的目标是包装CHKERRQPETSc库的宏,定义如下petscerror.h(为了便于阅读,分成多行):
#define CHKERRQ(n)
do {if (PetscUnlikely(n))
return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,n,PETSC_ERROR_REPEAT," ");}
while (0)
Run Code Online (Sandbox Code Playgroud) 我没有生成二进制文件ghc -O2 --make Test.hs,只有.o和.hi文件.Test.hs包含一个main :: IO ()函数并具有模块名称Test.
链接器不表现吗?我怎样才能解决这个问题?我在OSX上使用GHC 7.8.3,拥有Apple LLVM 5.0(clang-500.2.79)(基于LLVM 3.3svn)目标:x86_64-apple-darwin13.4.0
提前感谢您的任何提示