不用静态类型函数式编程语言的十大理由

发表于:2013-6-24 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  理由三:我喜欢大括号

  还有一点使我不想喜欢这种语言的原因是,我不明白这些与语言要把大括号去掉。去掉大括号还能叫编程语言么?看下我的意思。这是带大括号的代码:

  1. public class Squarer 
  2.     public int Square(int input) 
  3.     { 
  4.         var result = input * input; 
  5.         return result; 
  6.     } 
  7.  
  8.     public void PrintSquare(int input) 
  9.     { 
  10.         var result = this.Square(input); 
  11.         Console.WriteLine("Input={0}. Result={1}", input, result); 
  12.     } 
  13. }

  这个则是去掉大括号的相同的代码:

  1. type Squarer() =  
  2.  
  3.     let Square input = 
  4.         let result = input * input 
  5.         result 
  6.  
  7.     let PrintSquare input = 
  8.         let result = Square input 
  9.         printf "Input=%i. Result=%i" input result

  看看差别吧,你怎么想我不知道,但是我真心觉得第二种语言有点像垃圾,就像漏掉了什么东西似得。

  实话说,如果没有大括号给我指引,我总觉得少了些东西。

  理由四:我喜欢看到明确的类型

  函数式语言的支持者声称,类型推断使代码更清洁,因为任何时候你都无须用类型声明干扰您的代码。

  好吧,碰巧,我喜欢看类型声明。如果我不知道每个参数的精确类型,我会觉得不舒服。这就是为什么Java 是我最喜欢的语言。

  这是一个某些ML-ish代码的函数签名。不需要类型声明,所有类型自动推断。

  1. let GroupBy source keySelector =  
  2.     ...

  这是C#的类似功能代码的函数签名,带有明确的类型声明。

  1. public IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>( 
  2.     IEnumerable<TSource> source, 
  3.     Func<TSource, TKey> keySelector 
  4.     ) 
  5.     ...

  在这方面我或许是属于少数派,但我更喜欢第二个版本的说法。知道返回值的类型是IEnumerable<IGrouping<TKey, TSource>>对我而言极为重要。

  确实,编译器会为你检查它的类型,并在类型不匹配的时候提醒你。但为什么要让编译器代替你做你能做的工作呢?

  好吧,我承认如果你使用了泛型,匿名,返回值为函数的函数,以及其它一切新奇的东西,那么你的类型声明将变得复杂又难以理解。而这使得正确判断类型变得非常困难。

  但对此我有个简单的弥补办法——不使用泛型而且不要传递函数,你的签名将变得简单许多。

32/3<123>
100家互联网大公司java笔试题汇总,填问卷领取~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号