理由三:我喜欢大括号

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

    public class Squarer
    {
        public int Square(int input)
        {
            var result = input * input;
            return result;
        }
    
        public void PrintSquare(int input)
        {
            var result = this.Square(input);
            Console.WriteLine("Input={0}. Result={1}", input, result);
        }
    }

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

    type Squarer() = 
    
        let Square input =
            let result = input * input
            result
    
        let PrintSquare input =
            let result = Square input
            printf "Input=%i. Result=%i" input result

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

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

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

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

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

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

    let GroupBy source keySelector = 
        ...

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

    public IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
        IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector
        )
        ...

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

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

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

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