zoukankan      html  css  js  c++  java
  • Haskell 笔记 ②

    如何写一个求阶层函数?

       fac 0 =1

       fac n=n*fac(n-1)

       函数自适应匹配参数,可以把特判情况写在前面,注意按顺序匹配的,n这种万能情况写在最前面就完蛋了。同时你也注意到,函数只能一行写完,不能智能识别作用域啊!!

    ②灵活的使用你的函数参数!

    看这个求三元组第三个值的函数,占位符_的神奇使用。

    third::(a,b,c)->c

    third (_,_,c)=c

    更神奇的手艹head函数, (x:_)中占位符模拟出了列表的剩余部分

    head’::[a]->a

    head’ (x:_) =x

    若是固定长度的列表,可以这么写head’ (x:y:[] ) =x 或者 head [x,y]=x

    As模式(填坑中,看不懂)

    ④利用哨位(Guard)写出一个优美的递归程序, | 后面的那个布尔式叫哨位

    fac n

      | n==1 = 1

      | n==2 = 2

      |otherwise =n*fac(n-1)

    尽管函数式语言不允许全局变量存在(全局就变成函数了,函数是确定,不可修改的)但是一个函数的尾部可以用where开设一个只赋值一次且作用域只是本函数的变量区,方便值一次计算多次,重复使用,用完销毁,变量区的变量必须对齐了,不然编译错。

    fac n

      | n==1 = x

      | n==2 = y

      |otherwise =n*fac(n-1)

      where x=n*2

           y=n*3

    where的一次赋值特性其实表明它本体就是个函数,所以支持函数的匹配特性

    where (f:_)=”2333”

         (s:_)=”3223”

    where的老婆let

    我们知道let可以定义一个常量(函数),函数中let更是where的好妻子,其实它们就是倒过来而已。

    看这个代码:

    f length width height=

       let s=length*width

       in v=s*height

    先开变量区,最后in进行表达式求值。

    俗话说女人拥有社会最高权力,let..in 可以脱离函数使用,求个值~

    let还支持分号和逗号,挤空间什么的。

    let a=1;b=2;c=3 in a+b+c,let d=4 in a+b+c+d

    列表表达式的条件区也可以写let,不过此时let式子不是过滤,而是计算作用了

    f xs=[ans|x<-xs,let ans=x^2]

    ⑥简便而灵活的case .. of

    C语言中的swich/case用法,不过这里的使用更加灵活,其实就是按顺序的模式匹配

    f::String->String

    f str = "hello" ++ case str of  "world" ->" world"

                             "fuck"->" bi~"

                              ""->" none"

    还记得where不?前面说where开辟的其实就是一块函数区,那么这里可以这么改写, YYwhat函数而不用考虑类型。

    f::String->String

    f str = "hello" ++ what str

          where what "world"=" world"

                what "fuck"=" ~bi"

                what ""=" none"

  • 相关阅读:
    函数式编程:用户登录和注册
    文件操作
    shell介绍
    函数返回值
    selenium 事件介绍
    Linux添加硬盘设备
    分布式系统中幂等性、at least once 和 at most once 问题
    HBase面试考点
    简单理解:数据库的一致性与四种隔离级别(+MySQL实现)
    大数据框架Hive优化方法
  • 原文地址:https://www.cnblogs.com/neopenx/p/4276176.html
Copyright © 2011-2022 走看看