zoukankan      html  css  js  c++  java
  • Haskell函数式编程之一语言初体验

    如果你是使用面向对像语言进行编程的程序员,那么你应该去了解掌握一门动态语言。而动态语言的魔力之一就是函数式编程。而要学习了解函数式编程,那么haskell是一个不错的选择。

    Haskell是是一门纯函数式编程语言(purely functional programming language)。在其世界中函数是第一等对象。并且在haskell中没有赋值,例如你指派a的值为5,然后你无法再给a分配其它的值。所以你不能像命令式语言那样命令电脑“要做什么”,而是通过函数来描述出问题“是什么”。

    作为一个纯的函数式编程语言,它支持惰性求值、模式匹配、列表解析、类型类、类型多态……

    别着急,让我们慢慢来解开函数式编程的面纱。

    安装Haskell

    1. 可以去官网下载安装包进行安装。

    2. mac平台的用户可以通过homebrew进行安装。

    在terminal下输入brew install haskell-platform即可。

    使用Haskell

    安装完毕后haskell platform的解释器GHC就已经在你的电脑上了。GHC可以解释执行Haskell脚本,即后缀名为.hs的文件。你可可以通过在terminal输入ghci进入交互模式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    twer@bowen-huang:~$ ghci
    GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
    Loading package ghc-prim ... linking … done.
    Loading package integer-gmp ... linking … done.
    Loading package base ... linking … done.
    Prelude> 1+2
    3
    Prelude> 3*4
    12
    Prelude> 5/1
    5.0
    

    关于Haskell的编辑器你可以使用任何喜欢的编辑器:Vim、Emacs、Sublime、TextMate…..我比较喜欢Sublime。因为在Sublime自带Haskell的快捷编译执行。只需要按Ctrl+B来直接运行Scripts脚本。

    在ghci交互模式下可以使用:l命令来load一个Haskell脚本,然后就可以调用此脚本中的函数。我们先写一个’Hello world!’程序,然后通过ghci来load和调用.

    HelloWorld.hs
    1
    
    main = print $ "Hello world!"
    
    1
    2
    3
    4
    5
    
    Prelude> :l HelloWorld.hs
    [1 of 1] Compiling Main ( HelloWorld.hs, interpreted )
    Ok, modules loaded: Main.
    *Main> main
    "Hello world!"
    

    如果对文件进行了修改,也可以直接通过:r来重新加载文件。

    Haskell的基本语法

    加减乘除操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Prelude> 1 + 2
    3
    Prelude> 3 - 1
    2
    Prelude> 3 * 4
    12
    Prelude> 5 / 1
    5.0
    Prelude> 10 / (-5)
    -2.0
    

    注意对负数进行操作时要将其用()括起来,否则系统会报错。

    判等与比较操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    Prelude> 5 == 5
    True
    Prelude> 10 == 8
    False
    Prelude> 5 /= 5
    False
    Prelude> 10 /= 8
    True
    Prelude> 5 >= 3
    True
    Prelude> 5 <= 3
    False
    Prelude> True && True
    True
    Prelude> True && False
    False
    Prelude> False || False
    False
    Prelude> True || False
    True
    Prelude> not True
    False
    Prelude> not False
    True
    

    控制流转

    1
    2
    3
    4
    5
    
    Prelude> let isHello x = if x == "Hello" then True else False
    Prelude> isHello "Hello"
    True
    Prelude> isHello "World"
    False
    

    注意这里的条件判断中的else是不可以省略的,这样保证条件语句总会返回一个值。所以我们可以将整个if..then..else pattern看做一个表达式。

    如果在脚本文件中写的话不需要使用let关键字。并且也可以采用另一个写法。

    isHello.hs
    1
    2
    3
    
    isHello x
     | x == "Hello" = True
     | otherwise     = False
    

    |表示或,otherwise关键字表示其它的情况。当然你也可以将这三行代码写成一行,这样也是能够正常运行的。分成三行只是为了更加可读。

    还有第三种写法,实际上与面对对象语言中的switch…case语句有些类似。

    isHello.hs
    1
    2
    3
    
    isHello x = case x of
     "Hello" -> True
     otherwise -> False
    

    这和第二种写法很类似。其实第二种写法本质上就是case语句,它只是case语句的一个语法糖而已。

    另外,在Haskell中是没有各种循环语句的,如果要实现相似的特性当然要使用递归了。

    第二节中,我们会讨论这个问题。

    作者:黄博文@无敌北瓜
    出处:http://www.cnblogs.com/huang0925
    黄博文的地盘
    本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    数据可视化
    numpy知识点
    机器学习之支持向量机
    python中字符编码及unicode和utf-8区别
    hihocoder图像算子(高斯消元)
    scrapy
    线性规划问题求解(单纯形法)
    机器学习之隐含马尔可夫
    机器学习之决策树
    机器学习之逻辑回归与最大熵模型
  • 原文地址:https://www.cnblogs.com/huang0925/p/2976771.html
Copyright © 2011-2022 走看看