Jak*_*kob 32 haskell functional-programming coding-style naming-conventions verbosity
我最近开始使用Haskell学习函数式编程,并在官方的Haskell wiki上发表了这篇文章:如何阅读Haskell.
文章声称,短变量名如x,xs,和f被嵌合因为简洁和抽象为Haskell代码.从本质上讲,它声称函数式编程是一种独特的范式,其他范式的命名约定不适用.
你对此有何看法?
Ion*_*tan 31
在函数式编程范例中,人们通常不仅自上而下,而且自下而上构建抽象.这意味着你基本上增强了主机语言.在这种情况下,我看到适当的简洁命名.Haskell语言已经简洁而富有表现力,所以你应该习惯它.
但是,在尝试对某个域建模时,我不相信简洁的名称是好的,即使函数体很小.领域知识应该反映在命名中.
只是我的观点.
我将从第3章开始,从Real World Haskell中获取两个代码片段.
在名为" 更受控制的方法 "的部分中,作者提出了一个返回列表的第二个元素的函数.他们的最终版本是这样的:
tidySecond :: [a] -> Maybe a
tidySecond (_:x:_) = Just x
tidySecond _ = Nothing
Run Code Online (Sandbox Code Playgroud)
由于类型参数a和我们在内置类型上运行的事实,该函数是通用的,因此我们并不真正关心第二个元素实际上是什么.x在这种情况下,我相信已经足够了.就像在一个小数学方程式中.
另一方面,在名为" 引入局部变量 "的部分中,他们正在编写一个示例函数,该函数试图模拟银行域的一小部分:
lend amount balance = let reserve = 100
newBalance = balance - amount
in if balance < reserve
then Nothing
else Just newBalance
Run Code Online (Sandbox Code Playgroud)
当然不建议在这里使用短变量名.我们实际上关心这些金额代表什么.
Dal*_*ale 16
我认为如果参数的语义在代码的上下文中是清楚的,那么你可以使用短变量名称.出于同样的原因,我经常在C#lambdas中使用它们.但是,如果它不明确,您应该更明确地命名.
map :: (a->b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
Run Code Online (Sandbox Code Playgroud)
对于那些没有接触过Haskell的人来说,这可能看起来像丑陋,不可维护的代码.但是大多数Haskell程序员会马上理解这一点.所以它完成了工作.
var list = new int[] { 1, 2, 3, 4, 5 };
int countEven = list.Count(n => n % 2 == 0)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,短变量名称似乎是合适的.
list.Aggregate(0, (total, value) => total += value);
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,命名变量似乎更合适,因为它并不是立即明显的聚合物正在做什么.
基本上,我相信不要过于担心会议,除非绝对有必要让人们不要搞砸.如果您对此事有任何选择,请使用您正在使用的上下文(语言,团队,代码块)中有意义的内容,并且可以被其他人在数小时,数周或数年后阅读时理解.其他任何东西只是浪费时间的强迫症.
我认为确定范围是第一个原因.在命令式语言中,动态变量,尤其是全局变量,需要正确命名,因为它们在多个函数中使用.使用词法作用域,很清楚符号在编译时绑定到什么.
不可变性在某种程度上也有助于此 - 在C/C++/Java等传统语言中,变量可以表示不同时间点的不同数据.因此,需要给它一个名称,以便程序员了解其功能.
就个人而言,我觉得像头等功能这样的功能使符号名称变得多余.在传统语言中,与符号的关联更容易; 根据它的用法,我们可以判断它是数据还是函数.
我现在正在研究Haskell,但我不认为它的命名惯例是如此不同.当然,在Java中你几乎找不到像这样的名字xs.但很容易找到这样的名字x在一些数学函数,i,j为计数器等.我认为这样的名字是在正确的上下文中完全恰当.xs在Haskell中,只适用于列表上的泛型函数.在Haskell中有很多它们,所以这个名字广泛传播.Java没有提供处理这种通用抽象的简单方法,这就是为什么列表(和列表本身)的名称通常更加具体,例如lists或users.
| 归档时间: |
|
| 查看次数: |
4428 次 |
| 最近记录: |