日历

November 2020
M T W T F S S
 1
2345678
9101112131415
16171819202122
23242526272829
30  

函数式编程一问

Home Forums 《冒号课堂》讨论区 函数式编程一问

  • This topic is empty.
Viewing 1 reply thread
  • Author
    Posts
    • #1074
      Todd
      Member

      f = (x, y) => (y, x)

      上面定义了一个函数f,把(x, y)变成(y, x)。如果应用两次该函数则有f(f(x, y)) = (x, y)。这个过程是自内向外的:

      f(f(x, y)) = f(y, x) = (x, y)

      我的问题是:在函数式编程中有没有可能不经过这样的过程,而是自外向内从最外层f开始,先得出f(f) = (x, y) => (x, y),然后(f(f))(x, y) = (x, y)来进行?

    • #1252
      hui
      Keymaster

      在函数式中函数是first-class citizen,故可直接定义g = f . f,这样g实际上就是一个恒等变换,同时在形式上满足了你想要的“先外后内”。至于编译器(或解释器)能否更聪明地直接把g用恒等变换代替,那就归结为函数简化的问题了,而这并非易事(尽管该个例很简单,但难有普适方法)。当然,象LISP这种能进行符号运算(区别于数值运算)的函数式语言,完全可能对一些复合函数通过符号处理来简化。不过,符号处理本身并非函数式的必要特性。

      另外,如果不考虑效率的话,程序员倒也不用关心这类简化问题,代码的抽象性不会因此而发生变化。

Viewing 1 reply thread
  • You must be logged in to reply to this topic.
 请您评分1星(很差)2星(不行)3星(一般)4星(不错)5星(很棒)