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
    黄博文的地盘
    本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/huang0925/p/2976771.html
Copyright © 2011-2022 走看看