zoukankan      html  css  js  c++  java
  • haskell中的let和where

    haskell中有两种定义局部变量的方法let和where,方法分别如下

    roots a b c = ((-b + det) / (a2), (-b - det) / (a2))
          where det = sqrt(b*b-4*a*c)
                   a2 = 2*a
    roots a b c = let det = sqrt (b*b - 4*a*c)
                            a2 = 2*a
                       in ((-b + det) / a2, (-b - det) / a2)

    这两种方法都可以使全局变量定义失效

    det = "Hello World"
    roots a b c =((-b + det) / (2*a), (-b - det) / (2*a))
        where det = sqrt(b*b-4*a*c)
    roots' a b c=
        let det = sqrt(b*b-4*a*c)
        in ((-b + det) / (2*a), (-b - det) / (2*a))
    f _ = det
    *Main> roots 1 3 2
    (-1.0,-2.0)
    *Main> roots' 1 3 2
    (-1.0,-2.0)
    *Main> f 'a'
    "Hello World"

    对于let和where混用,那么是let的优先级高,也就是说优先使用let定义的变量,而不是where定义的变量,比如

    f x =
        let y = x+1
        in y
        where y = x+2
    *Main> f 10
    11

    等于11而不是12

    对于let和where,同样也支持模式匹配,例如

    showmoney2 a b c=
        (create a 0 0)+(create 0 b 0)+(create 0 0 c)
        where create 1 _ _=1
              create _ 1 _=2
              create _ _ 1=3
    
    showmoney a b c=
        let create 1 _ _=1
            create _ 1 _=2
            create _ _ 1=3
        in (create a 0 0) + (create 0 b 0) + (create 0 0 c)
    *Main> showmoney 1 1 1
    6
    *Main> showmoney2 1 1 1
    6
  • 相关阅读:
    php内核为变量的值分配内存的几个宏
    php7 引用成为一种类型
    function参数
    execvp php-fpm reload使用的函数
    fastcgi
    php-fpm定时器
    php 类继承
    php 对象 调用静态方法
    php unset变量
    php5数组与php7数组区别
  • 原文地址:https://www.cnblogs.com/sickboy/p/3323388.html
Copyright © 2011-2022 走看看