【问题标题】:Scheme - Imperative to Functional Programming方案 - 函数式编程的必要条件
【发布时间】:2012-03-03 02:31:26
【问题描述】:

我刚刚开始学习函数式编程(方案)。 但我仍然在“功能上”思考问题。

类似:

func1(int a){
   if(a==100)
      a=0;
   return func2(a);
}

那里有一个状态变化,所以这是命令式编程。

如果我将“if”部分放入另一个函数中,这是否使它具有功能性?

func1(int a){
   return func2(func3(a));
}

这就是全部内容吗?

谢谢!

【问题讨论】:

    标签: functional-programming imperative-programming


    【解决方案1】:

    不是真的。首先,函数式编程的含义有几种不同的定义,并且会因社区而异。通常情况下,Haskellers 的想法与 Schemers 有点不同。

    严格来说,函数式编程使用函数作为原语,因此可以将它们放入变量中并作为参数传递,而无需在过程中对其进行评估。

    Haskellers 通常会满足纯度要求。函数纯度是指函数不能有副作用(包括状态变化);即每次调用具有相同参数的函数都必须返回相同的值。

    您的第二个功能在第一个条件下失败,这是必要的。您没有将函数用作一等公民。

    这样写的话,

    func1(int a) {
      return (
        if (a==100)
          then func(0);
          else func2(a);
        )
    }
    

    现在这是纯粹的,但它既不是特别实用也不是特别必要。

    由于上下文太少,我无法将您的示例真正翻译成特定功能。函数式代码通常的“hello world”是这样的:

    square(x) = x * x
    twice(f, x) = f(f(x))
    twice(square, 4)
      => 256
    

    这里我们定义了一个函数square,它将数字与自身相乘。我们定义了另一个函数twice,它接受一个函数和一个参数,并将函数应用于参数两次。然后我们给函数twice 提供参数square4。请注意,这不是 twice(square(4)) - 函数 square 直到在函数 twice 的定义内才被评估。

    【讨论】:

    • “你的第二个函数在第一个条件下失败”第一个条件 = 使用函数作为原语?抱歉,我不明白为什么我的第二个代码不起作用,而你的却是。
    • 我确实说过我的示例没有什么特别实用的功能。但它是纯粹的,因为它不会与状态混淆。这个例子只是一个if,它没有足够的东西使它可以正常工作。这有点像给生物学家几个核苷酸,然后问他是树还是灌木。
    • Schemers 会避免不必要的副作用(如 OP 示例中的副作用),但我们偶尔会使用它们。一个人通过经验找到平衡;在“再培训”时,最好向纯洁犯错误。
    • @RyanCulpepper:我同意;我的意思是大多数 Haskeller 将纯度纳入 FP 的定义(Scheme 和其他混合体充其量只能获得一些“弱功能”标签)。
    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多