gpt4 book ai didi

haskell - 概述,但在函数式编程中非常重要

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:06 26 4
gpt4 key购买 nike

函数式编程中非常通用的函数是什么样的?

有人说“我们没有对象,但我们有高阶函数”。高阶函数会取代对象吗?

在编写面向对象的应用程序时,我多次尝试从更一般的想法转向更详细的想法。如果我尝试在函数式编程中这样做,我是否需要大量高阶函数?

最佳答案

这个答案面向 Haskell 而不是 Lisp,因为尽管 lisp 具有高阶函数,但惯用的 lisp 可以而且通常是非常面向对象的。

我们还将忽略通常与面向对象编程相关但有点正交的继承(和临时多态性)。

通常,抽象数据类型“取代”对象,在某种意义上,通常您使用对象将一堆相关数据捆绑在一起,例如Java 或 Python,然后声明一种数据类型以在 Haskell 或 ML 中执行此类操作。

然而,对象也将行为 与数据捆绑在一起。所以一个类的对象有数据,但也有可以访问和改变该数据的函数。在函数式风格中,您只需在该数据类型之外的数据类型上声明函数。然后通过模块或使用闭包提供封装。

关于后一点——闭包和对象是对偶的,尽管这样表达它们不一定是惯用的。在波特兰模式 wiki 上有一些非常老派的讨论:http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent .

哦,还有一个来自 oleg 的例子:http://okmij.org/ftp/Scheme/oop-in-fp.txt .

忽略类型类(这对于惯用的 Haskell 来说是必不可少的),只关注核心函数式编程,这里是一种不同方法的草图,可以通过 OO 语言中的继承来完成。函数 foo 使用一些实现接口(interface) A 的对象和一些实现接口(interface) B 的对象来生成一些 Double。对于高阶函数,您可能拥有 fooGen::(a -> Double -> Double) -> (b -> String -> Double) -> a -> b -> Double.

那个签名说 fooGen 接受一个函数从一些 a 和一个 Double 到另一个 Double,一个函数从一些 b 和一个 String 到一个 Double,然后它接受一个 a 和一个 b,最后它返回一个 Double。

因此,现在您可以通过部分应用将“接口(interface)”与具体值分开,通过声明,例如,fooSpecialized = fooGen funcOnA funcOnB

使用类型类,您可以抽象出“接口(interface)实现”(或者,用更恰当的语言,字典)的具体传递,并声明 foo::HasSomeFunc a, HasSomeOtherFunc b => a -> b -> 双。您可以将 => 左侧的内容视为松散地声明您的具体 a 和 b 类型需要实现的接口(interface)。

当然,这只是对一个非常笼统的问题的部分回答。

关于haskell - 概述,但在函数式编程中非常重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com