1

如果已经问过这些,请随时向我指出其他答案!

我只是在本月的新版本中开始使用 F#。我在 OO 和函数式语言(Haskell 和 Scheme,但不是 OCaml/ML)方面都有一些背景。到目前为止,在阅读 F# CTP 附带的小教程时,已经出现了几个问题。

1)可变变量比单子更受欢迎吗?如果是这样,在 F# 中是否完全避开了 monad?

2)我对使用的大写有点困惑。在本教程代码文件中,有时函数以小写字母开头,有时以大写字母开头。我知道 MS 倾向于喜欢带有函数和方法的初始上限,但在这里似乎有两种方法可以做到这一点。这对我来说没什么大不了的,因为我只是在自己的时间里玩耍,但我很好奇标准是什么。

3) 我对面向对象和功能样式的整个组合感到很困惑。print_string "string"有道理,但是这里是List.map fn list(除非 List 只是名称空间,如果是,请原谅我)。那么这里是str.Length。任何人都关心阐明何时使用什么,哪个是首选?

谢谢!

4

3 回答 3

5

关于可变性:F# 让你变得务实。我很少喜欢 state monad 而不是 mutable/ref,但你可以做任何你喜欢的事情。Monad 并没有被回避,但我认为人们倾向于只在它们明显获胜时才使用它们(例如异步编程)。

关于命名:“函数是值”这一事实存在张力,这意味着您可以选择用大写字母(因为它是一个函数,并且函数以大写字母开头)或用小写字母命名一个 let-bound 函数(因为它是一个 let-bound 值(恰好在其类型名称中有一个 '->'))。就我个人而言,我更喜欢始终对所有函数使用大写名称,但您会看到两种样式(特别是因为 F# 库本身的样式在过去一两年中一直在缓慢发展/标准化)。整个 .Net 似乎都在回避下划线,F# 库也不再是一个例外(还有一些名称使用下划线,但它们现在很突出,可能会被更改)。

关于功能风格:我不清楚你在问什么。对于 List.map,“List”是 F#模块的名称,“map”是该模块中的函数。成员函数(例如 str.Length)具有在整个 .Net 中普遍使用的优势,并在编辑器中提供了良好的智能感知体验。

于 2009-05-29T06:10:22.597 回答
5

1)我不会说 monads 被回避...你提到你有一些 Haskell 的背景 - 所以 F# 工作流是你想要研究的(术语工作流可能令人困惑,但这些只有一点点与业务流程有关)。一般来说,序列表达式和更普遍的计算表达式(又名工作流)将接近于 monad。这就是说 mutable 很常见,尽管我不确定“首选”是否是表达它的方式。他们每个人都有一席之地-就我个人而言,我从两本书开始-“F#基础”-但如果您想深入研究-请选择“专家F#”-两本书都很好。老实说,我需要 Foundations 来帮助我入门。

2) 根据我的经验,令人困惑的是 .NET 中的传统函数有一个真正不适合函数式编程的约定。因此,我觉得在 F# 中,当您查看“传统 .NET”命名函数的使用与 F# 中明显具有功能的元素时,有时可能会感到困惑......例如,在我上面提到的书中'Expert F#' - 他们提到您会在 camelCase 和 PascalCase 中看到诸如 List.map 和 Dates.Today 之类的 let 值(Pascal 案例是更传统的 .NET)。一个好的经验法则是,如果您停留在函数式世界中 - 使用更传统的函数式(camelCase)命名 - 但是如果您所做的预计会被其他 .NET 语言使用,请使用更多的 .NET规范(帕斯卡)。

3) 我同意 OO 和函数样式的组合可能会造成混淆。同样,我不确定哪个是首选,除了说 F#(功能性)在功能范式方面清楚地设置了自己的样式。然而,F# 是 .NET 世界中的一种函数式语言(请注意我上面提到的命名相对混乱)......所以,这又不是完全明确的。

希望这会有所帮助......信不信由你,当您使用 F# 并考虑其他具有 C++ 与 C 共享概念的语言(例如)时,它会变得更容易。就个人而言,命名开始变得有意义,并且当我开始了解到我是 F# 是一种在传统平台上运行的函数式语言时,这些概念开始起作用 - 旨在进行互操作(尽管我不确定将互操作称为无缝是否合适: D)

于 2009-05-29T06:50:08.450 回答
2

一般来说,monad(F# 中的“工作流”)比 Haskell 中的少得多,首先是因为可变变量可用,所以人们不太可能选择使用 state monad。其次,没有更高级的类型变量,这意味着您不能编写重载的代码来处理任何 monad,这使得使用它们的吸引力大大降低。

它们常用的一个地方是序列表达式(它真的很像 Haskell 中的列表推导,但它们与列表 monad 密切相关)。

于 2009-05-29T07:22:40.257 回答