gpt4 book ai didi

haskell - 函数式语言中的部分求值和函数内联有什么区别?

转载 作者:行者123 更新时间:2023-12-03 15:28:29 26 4
gpt4 key购买 nike

我知道:

  • 函数内联就是用函数定义代替函数调用。
  • 部分评估是在编译时评估程序的已知(静态)部分。

  • 在 C 等命令式语言中,两者之间存在区别,其中运算符与函数不同。但是,在像 Haskell 这样的操作符也是函数的函数式语言中,两者之间有什么区别吗?

    两者之间的唯一区别是函数内联可以在程序的选定部分执行,而部分评估是在整个程序上执行(即 )?

    两种优化技术之间的语义差异是什么?

    最佳答案

    之间有区别

  • 在编译器(甚至预处理器)已知的一组给定运算符和函数上评估常量表达式,这发生在编译时。例如。编译器编译 print(2*2)print(4) .正如您似乎暗示的那样,这绝不需要限于运算符表达式(例如 print(sqrt(2.0) )
  • 部分评价,这是一个更广泛的概念。编译器可以意识到 print(myfunc(2))可以转换为 print(c)在哪里 c是调用 myfunc(2) 的结果.然后它可以(在“特化时间”)调用myfunc(2)确定c .当然,如果 myfunc有副作用,例如删除自己的硬盘而不是程序用户的硬盘。因此,编译器需要某种注解或属性来知道何时允许/希望这样做(例如 C++11 的 constexpr )

  • 内联是一个不相关的概念。内联函数调用意味着用被调用函数的主体替换调用。这个 body 没有被评估。

    There is a distinction between the two in imperative languages like C, where operators are distinct from functions. However, is there any difference between the two in functional languages like Haskell where operators are functions too?



    这种区别(运算符与函数)纯粹是句法,与内联和部分评估之间的区别无关:

    函数调用和带有运算符的表达式都可以在 C 中内联和编译时求值。编译时求值仅限于在一组固定的运算符和函数(主要是运算符,但这是历史事故)上的表达式

    这两个概念都是有意义的,并且在 Haskell 中是不同的。
  • 内联:ghc{-# INLINE f #-} , 其中 f不能递归,原因很明显,
  • 部分评估:这通常概括为 Supercompilation其中不仅转换了基本类型的表达式,甚至还转换了函数,例如转型map f (map g xs ) 到 map (f . g) xs )。它也可以(但不必)进行内联。 Template Haskell是在编译时(显式)评估程序的一部分的另一种方法。

  • 因此,您的标题问题的答案是:内联和部分评估之间的区别与函数和运算符之间的区别无关,并且在函数式语言中与在 C 中的情况大致相同。部分评估在 C 中可能更困难因为副作用(参见上面的删除硬盘)

    关于haskell - 函数式语言中的部分求值和函数内联有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26996110/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com