关于使用Swiftz库问题(函数编程)



最近我正在使用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中找到<*>代码,但原因尚不清楚。

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

Person().walk是一个函数-(Int) -> Void10是一个Int<*>所做的是函数应用程序—它将左操作数应用于作为右操作数的函数。换句话说,它调用右边的函数,左边的东西作为自变量。只是函数及其参数都可以是可选的(注意签名中的?s(。这有点像Haskell的<*>,但专门针对Maybe(Optional的Haskell对应项(。

如果您删除所有可选处理:

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

是的,这就是它的作用(加上处理期权(!

可选的操控也不难理解。CCD_ 14就是CCD_。两者均为CCD_ 16。这些都内置于Swift函数中。如果你不了解它们是如何工作的,请阅读本文。最终,如果fa为零,则<*>也返回零。

现在你可能想知道我们为什么需要这个功能。嗯,制作";应用这个函数";函数本身意味着我们可以将其传递给其他函数,并将其与其他函数组合!

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

<>是此库中定义的运算符。

<A、 B>表示操作员定义有两种类型的参数,称为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?,并返回函数本应返回的任何内容。

最新更新