函数式编程中的哪些技术难以学习但后来有用?

时间:2009-09-17 12:28:07

标签: haskell functional-programming

这个问题当然受到Haskell中Monads的启发。

7 个答案:

答案 0 :(得分:8)

围绕延续传递风格包围我的javascript编码很多

答案 1 :(得分:6)

我会说First-class functions.

  

在计算机科学中,编程   据说语言支持   一流的功能(或功能   文字)如果它将函数视为   一流的物体。特别,   这意味着该语言支持   在这期间建立新的职能   执行程序,存储它们   在数据结构中,将它们作为   其他函数的参数,和   将它们作为其他的值返回   功能。这个概念没有涵盖   任何语言外部的手段和   程序(元编程),如   调用编译器或eval   用于创建新功能。

答案 2 :(得分:6)

您想测量与功能编程本身或编程有关的有用性吗?

一般而言,函数式编程的积极体验不是来自特定技术,而是来自改变思维的方式 -

  • 持有不可变数据
  • 以声明方式(递归,模式匹配)
  • 将功能视为数据

所以我会说函数式编程就是你自己问题的答案。

但是为了给出一个更具体的答案,我会投票支持像

这样的功能抽象机制
  • 单子
  • arrows
  • 延续传递式
  • zippers
  • 高阶函数
  • 泛型+类型类。

正如已经说过的那样,它们在第一个视图中是非常抽象的东西,但是一旦你理解了它们,它们就是非常酷且有价值的技术,可以编写简洁,错误安全的内容,但最后但并非最不重要高度可重复使用的代码。

比较以下(伪代码):

// Concrete
def sumList(Data : List[Int]) = ...

// Generic
def sumGeneric[C : Collection[T], T : Num](Data : C) = ...

与第一个定义相比,后者可能有点不直观,但它允许您使用任何集合和数字类型!

总而言之,许多现代(主流)语言已经发现了这些好处,并引入了非常实用的功能,如lambda functios或Linq。了解这些技术也将改善用这种语言编写代码。

答案 3 :(得分:3)

一个来自“高级”部门:使用幻像类型编程(有时也称为索引类型)。它无疑是函数式编程中的“标准”技术,但也不是完全深奥的,它可以让你的大脑忙碌一段时间(你要求一些困难的东西,对吗?))。

简而言之,它是关于参数化类型进行编码并在编译时静态强制执行某些属性。其中一个标准示例是向量加法函数,它静态地确保给定两个长度为N和M的向量将返回长度为N + M的向量,否则会出现编译时错误。是的,有更多有趣的应用程序。

这些技术在C ++中并不像在适当的函数式编程语言中那样有用,但到目前为止,我已经设法在我最近的所有项目中隐藏了一些这样的东西到不同程度,最近一次在C ++ EDSL环境中,它运行得非常好。你不一定要对花哨的东西进行编码,学习这有助于我捕捉到一些类型标签可以减少EDSL的冗长或允许更清晰的语法的情况。例如。

不可否认,语言支持和你想要实现的目标在某种程度上限制了它的用处。

一些先发者:

Generic and Indexed Type (slides with some brief applications overview)

Fun with Phantom Types

幻灯片中提到的Kennedy和Russo论文是Generalized Algebraic Data Types and Object Oriented Programming,并将其中的一些内容放入C#/ Java的上下文中。

Dave Abraham的书C++ Template Metaprogramming中的第3章是available online as sample chapter,并在C ++中使用这些技术进行维度分析。

使用幻像类型的实用FP项目是HaskellDB。

答案 4 :(得分:2)

我想说OCaml中的Structural typing特别有益。

答案 5 :(得分:1)

递归。有时难以绕过它

答案 6 :(得分:1)

高阶函数,lambda函数和易于组合的通用算法的概念对我来说非常有益。当我看到我可以用haskell折叠做什么时,我总是很兴奋。 同样,我进入函数编程(特别是haskell)后,我在C#中的编程发生了很大的变化(我希望更好)。