随着微软推出vs2010,c#4.0,一个新的语言随之诞生——F#;大家绝大部分人应该在学校从C学习,到c++,到java或者c#.但在这个过程中其实我们的思维已经被束缚在如何编写计算机能识别能理解的代码,比如我们必须得考虑给存储空间时而分配变量a时而分配变量b,渐渐的我们淡忘了解决问题的核心逻辑应该是人的思维方式,渐渐的我们习惯于被计算机思维所奴役,渐渐的我们发现编写代码牛b的人是对计算机结构最了解的人......;随着函数式编程在人工智能领域的发展;从Lisp,haskell...到F#,函数式编程语言语言走过的路曲折而漫长。
    下面举个简单的例子(快速排序)说明函数是语言如何按照人的逻辑编写(用haskell语言举例,该语言和F#很相似),对照传统c语言的写法做简单的说明:
  
  qsort []     = []
  qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)[edit]
    上面这段程序你不用了解haskell语言你也可以明白,第二句是排序的核心,把小于x的排在输出的最前面,x排在中间,大于等于x的排在输出列表的最后。
  
void qsort(int a[], int lo, int hi) {
{
  int h, l, p, t;  if (lo < hi) {
    l = lo;
    h = hi;
    p = a[hi];    do {
      while ((l < h) && (a[l] <= p)) 
          l = l+1;
      while ((h > l) && (a[h] >= p))
          h = h-1;
      if (l < h) {
          t = a[l];
          a[l] = a[h];
          a[h] = t;
      }
    } while (l < h);    t = a[l];
    a[l] = a[hi];
    a[hi] = t;    qsort( a, lo, l-1 );
    qsort( a, l+1, hi );
  }
}  
  这是一段c语言的快速排序,很明显必须得考虑所用的临时变量何时应该赋上何值,这些原本归计算机考虑的事情。  上面的例子可以看出函数式编程和命令式编程的本质,这里我不是要讨论效率(第一种也许没有第二种快),程序语言做为一种生产工本身就是来加快生产力的发展,如果按照人的思维逻辑编程能够应用到广泛的社会生产中,必然将会取代以计算机的思维模式编程。
   F#的推出,微软也有让.net开发者用F#编写核心代码,c#/vb继续完成页面层工作的活。   微软是个孜孜不倦的巨人,从c#1.0到c#3.0的linq,c#娱乐结构化语言第四代语言的特性;从c#1.0到c#3.0,c#4.0,c#又多了动态语言的特性;从c#1.0到F#,一个质变的开始,函数式语言通过广大民众喜闻乐见的vs平台上总算能见到函数式语言了。
(纯属个人见解,欢迎拍砖)
     

解决方案 »

  1.   

    都写成
    qsort []     = []
    qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)[edit]我回家卖白菜去.
      

  2.   

    以前在写/看一些javascript代码的时候,就发现有些逻辑复杂的代码用函数式编程来写很漂亮。F#还没接触过,楼主再多放些F#相关的东西在这里让大家多了解一下。
      

  3.   

      qsort []     = []
      qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)[edit]
      
    倒塌,看了半天都看不懂
      

  4.   

    后面那个[edit]多了...,版主帮忙删掉,filter是haskell的库函数,filter函数取一个限制条件和一个List, 返回该List中所有符合该条件的元素.
      

  5.   

    语言随着需求和硬件等升级会不断进步,永远不会停止。
    4.0里还有
    DLR (Dynamic Language Runtime) 
    C# and VB .NET 
    Web and Networking 
    Basic class libraries(BCL)等技术
      

  6.   

    并行计算与硬件发展同步 
    .NET Framework 4.0中PLINQ就不错
      

  7.   

    你写的例子有些不恰当,因为你的haskell代码中不包含filter的代码,而后边的c代码中却包含了划分的代码。实际上,c代码中几乎全都是执行划分功能的代码,而递归仍然只是最后两行。也就是说,c代码本来也是简介清晰地,但是你故意把filter搀和进来来说明c代码的复杂,这是很不公平的。此外,c并没有标准的“表”结构,而haskell有表结构这个概念。让我们用一个c#程序简单对比一下:    List<T> qsort<T>(List<T> table)
        {
            if (table.Count == 0)
                return table;
            else
            {
                List<T> left, right;
                var s = table[0];  //选择第一个元素为划分元素
                Partition(table, s, out left, out right);  //用划分元素分成左右两个表
                left.Add(s);  //把s加入左表的最后
                left.AddRange(right);  //把right加入左表的最后
                return left;
            }
        }使用Partition方法将输入的表划分为左右两个表,左表的元素不大于划分元素,右表的元素不小于划分元素。我向来并不是追求少写几行代码而故意写成天书,只要你熟练一种编程思路就好。所以这个方面,haskell和c我看不出有什么不同。
      

  8.   

    语言只是一个工具,编程思想才是最重要的。
    F#最多只是简化下需要你写的代码量而已,但最终执行必然一致或者相近。
    其实NI的labview做得不错,是图形化设计的,用户只关心数据流和处理方法,具体的实现由labview来负责。
    不过NI的硬件太贵,很多和硬件捆绑,限制了应用。
    个人认为,将来编程的发展趋势不应该是停留在语言上,而应该是向图形化设计发展。
      

  9.   

    sorry,没有递归。补充递归的部分:    List<T> qsort<T>(List<T> table)
        {
            if (table.Count == 0)
                return table;
            else
            {
                List<T> left, right;
                var s = table[0];
                Partition(table, s, out left, out right);  //首先划分
                var res = qsort(left);  //左递归
                res.Add(s);
                res.AddRange(qsort(right));  //右递归
                return res;
            }
        }
      

  10.   

    事实上,函数式编程在很多那里看来就是“少写了几行代码”那么简单。这丢弃了函数是式编程的很多本质特征。函数式程序总的来说运行时缓慢的,但是它应该可以:1. 自动匹配输入项,就像一个自动机的控制器一样自动匹配而不需要你控制代码。2. 支持回溯,从而初步可以实现人工智能程序。这是一个非常重要的特征。而我们用c、c#之类语言写的程序,当一个规则匹配失败的时候,虽然函数返回了,但是数据对象也破坏了。而函数式程序调用子程序的事后并来不直接传递对象,而是深度复制对象产生参数,就好像所有对象都是c#的值参那样传递。
      

  11.   

    其实我更担心的是:是不是.net 4.0的安装包要超过500M了!?
    3.5都有200多M- =~~~还是2.0好,20M哈哈
      

  12.   

    这个F#就是Fortran.net吧,微软一直在做。
      

  13.   

    恩 vs2010正式推出F#,02年就开始研发了。
      

  14.   

    嘿嘿,本人先学VB再弄Js在搞C++,不就没有被圈死到内存问题上么?各个语言都有优缺点,也不是说函数式就一定好,不过可以看出,语言越往下发展包装得越深,离底层越来越远了。
      

  15.   

    性能 更差 解释性的很多都是 MATLAB 中的M 语言算不是 函数式, 给科学工作者用的, 根本不可能适合大型软件,它简化了很 自动化更好但 项目一大,很多省略的东西,估计就会出问题, 少了很多介入点 和控制点..程序容易失控,不难于管理..当然可以更关注核心算法或业务. 但 这些 其它语言一样能轻松做到..特别是C#
      

  16.   

    F#早就有了,只不过微软对它的支持比较晚,我现在用的VS2008还需要单独安装F#的AddIn,然后才能进行F#代码的编译和调试。话说著名的SharpDevelop的核心代码就是用F#写的,而且开源,有兴趣的可以研究那个。
      

  17.   

    先支持一下.只是我个人认为,在C#/VB等语言里面,把一段代码封装成一个函数,也是可以达到类似的效果的.
      

  18.   

    喜欢Haskell的语法,来一个fibonacci:
    fib = 1 : 1 : zipWith (+) fib (tail fib)
    第一个是1,第二个是1,之后的就是前面2个相加,和数学上的定义如出一辙
      

  19.   

    其实都差不多吧,个人感觉。以前是按C或者C++格式来表达自己的想法,现在只是F#的格式来表达,从方法学上来说没太大却别,只是可能F#简易罢了。
      

  20.   

    更新太快了,matlab不就是函数式语言,一辈子都学不完,函数式语言减轻了开发者的负担,但也连开发者都不明白其中怎么实现。        ---------与时俱进
      

  21.   

    C#5.0
    http://channel9.msdn.com/pdc2008/TL16/[1]Meta-Programming Capabilities
    meta-programming是指:
    写一段“程序”,让机器执行之以生成一段“程序”,让机器执行之。
    前一个“程序”称为 meta-program,
    后一个“程序”称为 program。[2]Compiler As Service
    用托管代码重写编译器(原来是用C++编写的,使用IMetaDataEmit接口输出PE文件),
    支持其他人编写代码参与整个编译过程(估计类似Plugin)或者调用编译过程(类似已有的动态语言的eval功能)。class Test
    {
        static void Main(string[] args)
        {
            CSharpEvaluator ev = new CSharpEvaluator();
            ev.Eval(@"for (int i = 0; i < 10; i++) { System.Console.WriteLine('hello CSharp 5.0!'); }");
        }
    }
    C#风头比不上
    [1]F#
    [2]Fan
    [3]Scala可以考虑转型~~
      

  22.   


    不就是C#中镶嵌的Linq吗
      

  23.   

    别吓我~! ,刚 VB.NET 出了些头绪,又看到传说中的 F# 
      

  24.   

    C++程序员仍然在专注于C++因为他们知道 他们最精通的语言才是最好的语言.
    同样C#也是我最好的语言. 我用c#几乎能开发所有的应用程序.
    操作系统平台除外,除非微软想让你开发.我相信C#一样开发操作系统.
      

  25.   

    LZ是不是脑子被驴踢了,说胡话呢,你别编写计算机能识别能理解的代码啊,看计算机给你干事么!而且好坏不分,如果能熟练掌握C的话,比熟练掌握F#要强的多,只是你笨而已,越是高级的语言越是封装的狠而已,F#能帮你实现多少功能,事情是千变万化的,F#没实现的功能再让你来实现,你要费牛劲了,而且实际代码不知道多拖沓多冗长,拿F#写个操作系统试试
      

  26.   

    到现在为止,大多数工作并不能被函数式编程简化多少,有的时候还需要monad上阵,让人头大,函数式编程还需要一个飞跃,现在还是在老的编程语言上增加函数式编程特性的时代,函数式编程广泛应用还不是时候。看看函数式编程版多冷清就知道了。不过最近几年还是热了很多,以前我找中文资料都站不到,最近几年总算能找到一点了。
      

  27.   

    趋势是有的,不过多少年就不知道了。也可能几年,也没准我们这代都看不到了。不过Erlang很火,不知道以后的发展速度。
    现在函数式编程还是太深太难。
    你以后多去函数式编程版活动吧,那里实在太冷清了。我函数式编程水平不成(一定程度上是因为英文水平不好),在那个版也就是个看客。
      

  28.   

    至少到目前为止我还没有习惯函数式的思维方式,看来将来一段时间内也很难……
    年初接触了一下 GIMP 的 script,已经搞得相当昏了……