J C*_*per 1 oop f# functional-programming naming-conventions mutable
如果已经有人问过,请随时给我指出其他答案!
我本月刚刚发布新版本的F#.我有OO和函数语言的一些背景知识(Haskell和Scheme,但不是OCaml/ML).到目前为止,已经出现了几个问题,而不是阅读F#CTP附带的小教程.
1)可变变量优于monad吗?如果是这样,那么在F#中完全避开monad吗?
2)我对使用的大小写感到困惑.在本教程代码文件中,有时函数以小写字母开头,有时以大写字母开头.我知道MS倾向于喜欢带有函数和方法的初始大写,但在这里似乎有两种方法可以做到这一点.这对我来说并不是什么大不了的事,因为我只是在自己的时间玩耍,但我很好奇标准是什么.
3)我对OO和功能样式的整体组合感到非常困惑.print_string "string"有道理,但接下来就是List.map fn list(除非List只是命名空间,如果是这样,请原谅我).然后是str.Length.任何人都在关心何时使用什么,哪个更受欢迎?
谢谢!
关于可变性:F#允许你务实.我很少喜欢状态monad到mutable/ref,但你可以做任何你喜欢的事情.Monads并没有被回避,但我认为人们倾向于只在明确获胜时使用它们(例如异步编程).
关于命名:"函数是值"意味着你可以选择用大写字母命名一个let-bound函数(因为它是一个函数,函数以大写字母开头)或者用小写字母命名(因为它是一个let-bound值(恰好在其类型名称中有一个' - >').我个人更喜欢总是使用大写名称来表示所有函数,但是你会看到这两种样式(特别是因为F#库本身的风格在过去的一两年里一直在慢慢演变/标准化).在整个.Net中,下划线似乎都被避开了,而F#库不再是一个例外(有一些名称留下使用下划线,但它们现在像拇指一样突出,可能会被改变).
关于功能风格:我不清楚你在问什么.对于List.map,'List'是F#模块的名称,'map'是该模块中的函数.成员函数(例如str.Length)具有在.Net中常用的优点,并在编辑器中提供良好的智能感知体验.
1)我不会说monad被避开......你提到你有一些Haskell背景 - 所以F#工作流程是你想要研究的(术语工作流程可能令人困惑但这些只有一点点处理业务流程的事情).通常,序列表达式和更一般的计算表达式(也称为工作流程)将接近monad.虽然我不确定'首选'是表达它的方式,但是说可变性很常见.他们每个人都有一个地方 - 就个人而言,我从两本书开始 - "F#的基础" - 但如果你想潜入 - 去'专家F#' - 两者都很好.老实说,我需要基金会来帮助我开始.
2)根据我的经验,令人困惑的是,.NET中的传统函数有一个实际上不适用于函数式编程的约定.因此,我觉得在F#中,当你正在考虑使用'传统.NET'命名函数与F#中明显有用的元素时,你会感到困惑......例如,在我上面提到的那本书中'Expert F#' - 他们提到你会在camelCase和PascalCase中看到像List.map和Dates.Today这样的值(Pascal案例是更传统的.NET).一个好的经验法则是,如果你留在功能世界 - 使用更传统的功能(camelCase)命名 - 但是如果你正在制作的东西预计将被其他.NET语言使用,那么请使用更多的.NET.规范(帕斯卡).还要注意在功能世界中对缩写(itr,tbl等等)的容忍度要高得多,因为.NET通常已经远离这个...所以再次,你会看到不同程度的这个基于你是否调用功能元素与在F#中公开的元素在整个.NET中共享的东西.
3)我同意OO和函数样式的组合可能会令人困惑.再说一遍,我不确定哪个更受欢迎,除了说F#(功能性)在功能范例方面明确地表现出自己的风格.但是,F#是.NET世界中的一种函数式语言(请注意我上面提到的命名相对混乱)......再说一次,它并不是完全清晰的.
希望这有帮助...信不信由你,因为你使用F#并想到其他语言C++与C共享概念(例如) - 它变得更容易.就个人而言,命名开始有意义并且概念起作用,因为我开始认为我是一个F#是一种在传统平台上运行的功能语言 - 用于互操作(尽管我不确定无缝的互操作是否合适: d)