Tag: 函数式程序设计

模仿Haskell的列表模式

阅读之前,请注意,无需具备Haskell或函数式编程的先验知识。 文章 最近,我一直在试验Haskell,尤其喜欢一种功能-列表模式匹配中的(x:xs),其中x是当前元素,即所谓的“ head”,而xs是其余元素列表,即所谓的“尾巴”。 下面是一个示例,其中包含提到的功能,即列表的长度方法: 话虽如此,我开始怀疑用另一种语言实现此功能是否有用。 下一个代码段是尝试在Swift中“模仿”它: 如您所见,这两种方法都是“ Array”类型的扩展。 我称之为第一个(因为无法给出更好的名称)递归,它返回一个由可选元素(称为x)组成的元组,而数组的其余部分称为xs。 X是可选的,因为在某个时候可能还没有实际的元素。 它的身体是不言自明的:self.first是当前的头,self.dropFirst将返回“尾巴”。 但是,dropFirst的返回类型是ArraySlice而不是Array,因此是map方法。 现在,在某种程度上模仿了Haskell的功能,可以实现它的长度。 一般情况是返回1加上当前“迭代”末尾使用长度的结果,请参见示例2,l。 9.上面两行是列表为空并返回0或head元素不存在的情况,这意味着它等于null并仅返回1。 尽管它的实现方式不如Haskell中的原始方法那么优雅,但它可以在某种程度上对我产生吸引力。 我自己,我真的没有看到像Swift这样的语言进行递归的优势,我的一些认识Swift的朋友也没有。 但是,这可能是一种吸引人的设计模式。

Swift中的功能组合

数学中一个非常有趣的概念是函数合成 ,正如名称所暗示的那样,它允许将两个函数合成。 用数学符号表示,可以写如下的方程式 f-> x:x * 3 g-> x:x + 4 h-> x:f。 G h(5)= 27 总结起来,这意味着放在组合函数中的x值将首先在右边服务该函数,并且其结果将用作左边函数的参数。 Haskell是一种可以充分利用后者的编程语言,下面是一个示例: 所以, 将返回13。 但是我们如何在Swift中实现函数组合呢? 让我们使用游乐场看看! 优先级组的唯一用途是使我们后面的“°”中缀运算符保持关联。 …函数的签名非常有趣,让我们来看一下。 我们有三种通用类型-T,U和V。我们的第一个参数f1接受一个函数,该函数接受U并返回V。但是,第二个参数f2接受一个函数,该函数接受T并返回U。我们的返回类型为一个函数本身,它采用T,因此为f2的自变量,并返回V,因此返回类型为1。这是正确的,考虑到如何在顶部解释函数的组成。 由于我们的返回类型将是一个函数,因此我们必须能够插入一个值,因此,我们是否必须使用闭包,这将说明返回后的花括号。 将要输入的值称为x,然后将我们的函数放在一起:f1取f2,x取x。 我们定义了以下两个函数,以便可以测试组成,最后一个表达式表明它有效。 我们完成了,看起来不是很优雅吗?