天天看點

Scala 函數閉包和柯裡化

1 package com.atguigu.function
 2 
 3 object HighFunction {
 4   def main(args: Array[String]): Unit = {
 5     /*    val fun = (x: Int, y: String, z: Char) => {
 6         if (x==0 && y=="" && z=='0'){
 7           true
 8         }else{
 9           false
10         }
11     }
12     println(fun(0,"",'1'))*/
13 
14     /*
15       練習 2: 定義一個函數 func,它接收一個 Int 類型的參數,傳回一個函數(記作 f1)。
16       它傳回的函數 f1,接收一個 String 類型的參數,同樣傳回一個函數(記作 f2)。函數 f2 接
17       收一個 Char 類型的參數,傳回一個 Boolean 的值。
18       要求調用函數 func(0) (“”) (‘0’)得到傳回值為 false,其它情況均傳回 true。
19      */
20     def func(x: Int) = {
21       def f1(y: String) = {
22         println("我是f1!")
23 
24         def f2(z: Char): Boolean = {
25           println("我是f2!")
26           if (x == 0 && y == "" && z == '0') false else true
27         }
28         f2 _
29       }
30 
31       f1 _
32     }
33 
34 //    func(1)("")('1')
35   }
36 
37   println("```````````````````````````")
38 
39   def f1() = {
40     var a: Int = 10
41 
42     def f2(b: Int) = {
43       a + b
44     }
45 
46     f2 _
47   }
48 
49   // 在調用時,f1 函數執行完畢後,局部變量 a 應該随着棧空間釋放掉
50   val f = f1()
51   // 但是在此處,變量 a 其實并沒有釋放,而是包含在了 f2 函數的内部,形成了閉合的效果
52   println(f(3))
53   println(f1()(3))
54 
55   //閉包
56   /*
57     addByFour函數:
58     内部定義一個局部變量a 固定值是4
59     函數的傳回值是一個嵌套函數,完成a+b的操作,當外部調用時,addByFour()(2)隻需要控制第二個形參的數值
60     而第一個加數永遠是4,相當于固定了一個參數
61    */
62   def addByFour(): Int => Int = {
63     val a = 4
64 
65     def addB(b: Int): Int = {
66       a + b
67     }
68 
69     addB
70   }
71   println("結果是:" + addByFour()(3)) //4+3
72      

 函數柯裡化,其實就是将複雜的參數邏輯變得簡單化,函數柯裡化一定存在閉包

1   //函數柯裡化:把一個參數清單的多個參數,變成多個參數清單 也就是fun(a,b,c) -> fun(a)(b)(c) 分層函數調用
2   def addCurry(a : Int)(b:Int):Int ={
3     a+b
4   }
5      

作者:​​靠譜楊​​​,

更多日常分享盡在我的VX公衆号:小楊的挨踢IT生活