我喜欢 Chris Conway 的回答,它陈述了一些有助于对不同功能语言进行分类的重要轴。
在特定语言的特性方面,我将选择F#来调出许多其他 FPL 中没有的一些特性:
- 活动模式:许多 FPL 具有代数数据类型和模式匹配,但称为“活动模式”的 F# 功能允许您定义允许您对任意数据使用模式匹配语法的新模式。
- 计算表达式:F# 有一些用于编写单子代码的漂亮语法糖;虽然类型系统不能表达更高种类的多态性(没有对类型构造函数的抽象)所以你不能为任意的 monad M 编写代码,你可以为固定的 monad 编写的代码非常酷,人们在seq{} 或 async{} 单子。
- 引用:通常的“代码作为元编程的数据”位,尽管 F# 具有富有表现力的静态类型系统和丰富的语法,但我不确定有多少非 lisps 可以做到这一点。
在一般分类方面,F# 是
- 急切(严格,按值调用;但 'lazy' 是一个关键字和库,使用 seq/IEnumerable 来处理一些惰性是一种常见的策略)
- 不纯的(尽管语法使您偏向于更纯的默认样式)
- 静态的(带有类型推断,所以 F# 经常“感觉像脚本”,只有类型安全)
你的问题的措辞明显偏向于一些额外的语言语用学(例如它与什么运行时集成),但你也问什么“影响你的开发方式”,这些事情确实会影响:
- Visual Studio 集成意味着出色的编辑体验(例如 Intellisense)
- Visual Studio 集成意味着出色的调试体验(例如断点/跟踪点、本地变量、即时窗口……)
- 用于脚本或 UI-on-the-fly 的REPL是热门(fsi.exe 命令行,或集成在 VS 中的“F# Interactive”)
- .NET 集成意味着对于大多数“X”来说,已经有一个库可以做到这一点
- FsLex/FsYacc 等辅助工具,以及与 MSBuild 的集成,这使得“构建系统”变得容易
(我认为尝试将一种语言与其运行时和工具分开是一项学术活动。)
因此,我对一种特定语言的许多独特特征进行了描述,我是该语言的粉丝。我希望其他人可能会发布类似的答案,以突出其他个别语言的独特特征。