scala學習筆記(十一) 高階函式

2021-07-05 08:06:33 字數 2812 閱讀 1596

scala

作為函式式語言,函式自然是頭等公民…

乙個接收函式作為引數的函式稱為高階函式

比如定義如下:

defvalueatonequarter(f: (double) => double) = f(0.25)

這個函式接收乙個引數為

double

返回值為

double

的函式作為引數。

高階函式還可以是返回乙個函式作為引數的函式,如下

defmulby(factor : double) = (x : double) => factor * x

valquintuple = mulby(5)

quintuple(20)

mulby

的型別為:

(double)=> ((double) => double)

這裡的高階函式看上有點蛋疼,他的用處在於可以將乙個多引數的函式轉換成幾個一元函式。(後面知道這種叫閉包,並且也是柯里化的結果)

呼叫valueatonequarter

函式時,如果傳入的引數是匿名的,呼叫可以是以下方式:

valueatonequarter((x: double) => 3 * x)

由於型別推斷的存在以上呼叫的最終簡化版是

valueatonequarter(3* _)

scala:

defruninthread(block : () => unit)

}.start()

}上面**

runinthread

函式的引數是乙個無引數無返回值的函式

呼叫**如下

runinthread

看上去**並不美觀(

()=>

),這裡

scala

允許一種

換名呼叫表示法

: 在引數宣告和呼叫該函式引數的地方省略

() ,

但是在宣告的地方保留

=>  ,

如下:

defruninthread(block : => unit)

}.start()

}現在呼叫可以變成下面這樣:

runinthread

看看下面神奇**:

defuntil( condition : => boolean)(block : => unit)

}來看看呼叫:

var x =10

until (x== 0)

以上**類似於

while

迴圈,只不過把條件反過來了,乙個函式定義利用遞迴、柯里化、以及換名呼叫就實現了乙個自定義版本的

while

package demo

/** * @author administrator

*/object scalahighmethod

val r = values(-5, 5, x => x * x)

r.foreach(println)

r.foreach(p => println(p._1 + "->" + p._2))

val ar = array(4, 6, 9, 12, 45, 2, 5, 14, 12, 46)

val maxv = ar.reduceleft((v1: int, v2: int) => )

val maxv2 = ar.reduceleft(_ max _)

println(maxv)

val fun = (x: int) => (1 to x) reduceleft (_ * _)

val fun2 = (x: int) => (1 to x).foldleft(1)(_ * _)

println(fun(4))

println(fun2(4))

println(largest(x => 10 * x - x * x, 1 to 10))

println(largest2(x => 10 * x - x * x, 1 to 10))

val pairs = (1 to 10) zip (11 to 20)

pairs map (adtopair(_ + _)) foreach

//原集合並沒有變化

pairs foreach

println(adtopair(_ * _)(6, 7))

val strs = array("yang", "ming", "wei")

val ints = array(4, 4, 3)

println(corresponds(strs, ints, _.length == _))

val vc = 10

unless(vc > 10)

} def corresponds(arg1: seq[string], agr2: seq[int], fun: (string, int) => boolean) =

def adtopair(p: (int, int) => int) =

def largest(fun: (int) => int, input: seq[int]) =

def largest2(fun: (int) => int, input: seq[int]) =

} def until(condition: => boolean)(block: => unit)

} def unless(condition: => boolean)(block: => unit)

} def values(low: int, high: int, fun: (int) => int) =

ab}}

python高階學習筆記(一) 高階函式

filter filter 函式接收乙個 函式 f 和乙個list 這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如,要從乙個list 1,4,6,7,9,12,17 中刪除偶數,保...

scala學習筆記 高階函式

scala混合了物件導向和函式式的特性。在函式式程式語言裡,函式是 頭等公民 也就是說函式很重要,它可以像任何其他資料型別一樣被傳遞和操作。也就是說,函式可以作為乙個值傳給乙個變數。在scala中,函式是 頭等公民 就和數字一樣。可以在變數中存放函式 val a ceil val b sqrt 當然...

scala學習筆記 十一 Queue stack

一 queue佇列是fifo 先進先出 queue分可變和不可變 immutable queue and mutable queue import scala.collection.mutable.queue var ints queue int var fruits queue string va...