Agda有一个非常简单的外部函数接口,用于从Agda调用Haskell函数。外部函数仅在编译的程序中执行(由阿隆佐和马隆佐编译器),以及在类型检查或解释期间不要减少。
外国金融机构由三个杂注控制:
IMPORT杂注
{
-#IMPORT Hs导入#-}
IMPORT杂注指示Alonzo在编译的代码中生成Haskell导入语句。上面的杂注将生成Haskell代码
导入HsImport
导入不仅限于模块名,还可以使用Haskell导入的完整语言。例如,
{
-#导入合格数据。映射为映射#-}
IMPORT杂注可以出现在文件中的任何位置。
COMPILED_DATA杂注
{
-#编译数据D HsC1。。HsCn#-}
COMPILED_DATA杂注告诉Alonzo,Agda数据类型的构造函数天
应编译为Haskell构造函数HsC1。。HsCn公司
。这些应该是现有类型匹配的构造函数类型的Haskell数据类型天
。未经检查编译器。
例子:
数据列表(A:Set):设置位置[]:列表A_::_:A->列表A->列表A{
-#COMPILED_DATA列表[](:)#-}
编译后的杂注
{
-#已编译f HsCode#-}
COMPILED杂注告诉Alonzo编译假定函数(f)
哈斯克尔准则Hs代码
.Hs代码
可以是正确类型的任意Haskell项。没有对Haskell代码执行任何检查。
例子:
假设字符串:集合{
-#内置字符串#-}{
-#COMPILED_TYPE字符串#-}数据单位:设置其中单位:单位{
-#COMPILED_DATA单元()()#-}假设IO:设置->设置putStrLn:字符串->IO单元{
-#COMPILED_TYPE IO IO#-}{
-#编译的putStrLn putStrLn#-}
多态函数
Agda是一种单态语言,因此多态函数被建模为以类型作为参数的函数。这些参数也将出现在编译后的代码中,因此在调用polymorphil时必须显式丢弃Haskell函数。例如,
假设映射:{AB:Set}->(A->B)->列表A->B{
-#编译地图(地图)#-}
在这种情况下,对map的编译调用仍将具有A类
和B类
作为参数,因此编译的定义忽略了它的两个第一个参数,然后调用多态Haskell映射函数。
功能过载
Agda不支持重载,因此必须在特定实例。由于编译器的实现方式,Haskell类型检查器不会能够推断出这些实例是什么,所以在调用重载函数时,我们必须显式关于它被调用的类型。例如,
假设IO:设置->设置_>>=_:{A B:设置}->IO A->(A->IO B)->IO B{
-#编译_>>=_(\__->(>>=)::IO a->(a->IO b)->IO b)#-}