代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

编译设计

  •  3
  • Shawn Mclean  · 技术社区  · 17 年前

    这是一个家庭作业问题:

    解释类型的转换 日常生活的一部分 参数化。

    到目前为止,我了解咖喱。但是我找不到任何关于编译器如何在内存中实现这样一个函数的资源。我是否可以被指向正确的方向,可能是要搜索的关键字或链接到资源的链接,也可能是关于编译器如何生成类型和符号表以及与问题相关的其他内容的解释。

    谢谢。

    2 回复  |  直到 12 年前
        1
  •  4
  •   Toon Krijthe    17 年前

    当前是将n个参数函数转换为n个一元函数:

    例如,如果您有三元函数f::t1 x t2 x t3->t,则可以将此函数表示为

    f1 :: t1 -> (t2 -> (t3 -> t))
    

    换句话说,f1是一个函数,它接受T1类型的参数并返回一个f2类型的函数。

    f2 :: t2 -> (t3 -> t)
    

    F2是一个函数,它接受t2类型的参数并返回f3类型的函数。

    f3 :: t3 -> t
    

    f3是一个函数,它接受类型为t3的参数并返回类型t。

    例如,如果f(a,b,c)=a+b*c,则:

    f3(C) == c1+c2*C where c1 and c2 are constant.
    f2(B) == f3(C) where c1 is constant and c2 is replaced with B.
    f1(A) == f2(B) where c1 is replaced with A.
    

    在函数语言中,函数是第一类公民,因此通常将它们作为返回类型。

        2
  •  0
  •   BenMorel Manish Pradhan    12 年前

    货币化就像固定函数的参数。您真正需要修改的是名为..的函数的原型。例如,如果你有 retn_type function(param1, param2) 在第一个参数上加上当前值,将其设置为一个固定值,就得到了一个新的函数。 retn_type(param2) 可以用不同于原始的方式调用和传递。

    实际上,您可以通过多种方式或黑客手段在编译器中获得它,但其简单性的核心是重新定义一个链接到第一个版本的新版本。所以当你打电话的时候 retn_类型(参数2) 假定参数1由curryfition指定,则执行第一个函数的相同代码。