【问题标题】:About using Swiftz library issues(Functional programing)关于使用 Swiftz 库的问题(函数式编程)
【发布时间】:2021-12-23 17:50:31
【问题描述】:

最近在用swift编程语言学习函数式编程,发现了一个名为Swiftz的库,发现了一个很奇怪的函数调用方式,想请教一下有没有人知道为什么会这样,谢谢!

这里的代码很简单,Person().walk <*> 10 对我来说太连线了,<*> 之前和<*> 之后是空格但没有发生错误????。

import Swiftz

class Person {
    func walk(step: Int) {
        print("walk \(step) step")
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Person().walk <*> 10
        // ⬇️ normal way for same result
        // Person().walk(step: 10)
    }
}

// print result: walk 10 step

我尝试在 Swiftz 中找到&lt;*&gt; 代码,但原因不明。

public func <*> <A, B>(f : ((A) -> B)?, a : A?) -> B? {
    return f.flatMap { $0 <^> a }
}

【问题讨论】:

    标签: ios swift xcode functional-programming


    【解决方案1】:

    是此库中定义的运算符。

    表示算子定义有两种类型作为参数,分别称为A和B。

    运算符有两个参数 f 和 a 用于左侧和右侧。在您的示例中,f 是 Person().walk,a 是 10。它返回一个可选的 B,其中 B 是 Person.walk 如果您调用它会返回的类型。

    f 是一个可选函数,以 A 作为参数并返回 B。在您的情况下,walk 接受一个 Int 参数并返回 Void,因此 A 是 Int,B 是 Void。右边应该是 A?,这很好,因为 10 是 Int 类型。

    然后它会调用另一个您需要检查的运算符。重要的是:该运算符接受左侧的任何函数,该函数有一个类型为 A 的参数,右侧有一个类型为 A? 的值,并返回该函数将返回的任何内容。

    【讨论】:

      【解决方案2】:

      Person().walk 是一个函数 - (Int) -&gt; Void10 是一个 Int&lt;*&gt; 所做的是函数应用程序 - 它将左操作数应用于作为右操作数的函数。换句话说,它以左边的东西作为参数调用右边的函数。这类似于 Haskell 中的 $ 运算符。

      您发现的实现实际上允许它的两个操作数都是可选的(注意签名中的?s)。处理这些选项有点“隐藏”&lt;*&gt; 的简单性。如果您删除所有可选处理:

      public func <*> <A, B>(f : ((A) -> B), a : A) -> B {
          return f(a)
      }
      

      是的,就是这样!

      可选处理也不难理解。 $0 &lt;^&gt; a 仅表示 a.map($0)。两者都是flatMap。这些是内置在 Swift 函数中的。如果您不了解它们的工作原理,请阅读this

      现在您可能想知道为什么我们需要这个函数。好吧,让“应用这个函数”本身成为一个函数意味着我们可以将它传递给其他函数,与其他函数组合!

      但是,我认为这在 Swift 中的效果不如在 Haskell 中。在 Swift 中,编译器需要能够将每个类型参数推断为已知类型,这会使许多在 Haskell 中可以轻松完成的事情变得困难和繁琐。

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多