成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala vs F#:函數(shù)式編程特性大比拼(一)

原創(chuàng)
開(kāi)發(fā) 后端 開(kāi)發(fā)工具
本文是51CTO獨(dú)家譯稿,講述Scala和F#函數(shù)式編程特性對(duì)比。Scala是一種基于Java的通用編程語(yǔ)言,它編譯成Java字節(jié)碼,在Java虛擬機(jī)(JVM)上運(yùn)行。F#是由微軟主持開(kāi)發(fā)的一個(gè)通用編程語(yǔ)言,它的面向?qū)ο蠛兔钍教匦源蟛糠侄寂c.NET平臺(tái)兼容。

【51CTO獨(dú)家譯文】我們喜歡把.NET和Java拿出來(lái)進(jìn)行比較:從測(cè)試速度安全性,從平臺(tái)之爭(zhēng)應(yīng)用廣泛性。而Scala和F#都是相對(duì)較新的編程語(yǔ)言,相對(duì)于.NET和Java編程語(yǔ)言,它們提供了許多非常吸引人的函數(shù)式編程特性,值得.NET和Java開(kāi)發(fā)人員仔細(xì)玩味和評(píng)估。

Scala是一種基于Java的通用編程語(yǔ)言,旨在推廣函數(shù)式編程,它編譯成Java字節(jié)碼,在Java虛擬機(jī)(JVM)上運(yùn)行。雖然Scala本質(zhì)上是一個(gè)函數(shù)式編程語(yǔ)言,但它也體現(xiàn)了面向?qū)ο笳Z(yǔ)言的所有必要元素,這一點(diǎn)使函數(shù)式編程特性對(duì)編程社區(qū)的吸引力更大。

[[12664]]
51CTO編輯推薦:Scala編程語(yǔ)言專題

F#是由微軟主持開(kāi)發(fā)的一個(gè)通用編程語(yǔ)言,它是.NET通用運(yùn)行時(shí)(CLR)的一部分,它是以另一個(gè)正統(tǒng)的函數(shù)式編程語(yǔ)言O(shè)caml為基礎(chǔ)的,微軟在.NET平臺(tái)中引入F#除了人們對(duì)函數(shù)編程的興趣不斷上升外,另一個(gè)重要的原因是函數(shù)編程非常適合高性能和并行計(jì)算。雖然它的語(yǔ)法清晰,但F#實(shí)際上混合了函數(shù)式編程語(yǔ)言,命令式語(yǔ)言和面向?qū)ο笳Z(yǔ)言的語(yǔ)法特性,它的面向?qū)ο蠛兔钍教匦源蟛糠侄寂c.NET平臺(tái)兼容,F(xiàn)#的三重性質(zhì)也很實(shí)用,它允許程序員使用任意結(jié)合這三個(gè)編程語(yǔ)言的特性使用。

[[12665]]
51CTO編輯推薦:F#函數(shù)式編程語(yǔ)言專題

本文將對(duì)Scala和F#功函數(shù)編程語(yǔ)法和相關(guān)特性進(jìn)行對(duì)比,看看它們之間有何異同點(diǎn)。

一等函數(shù)

Scala和F#中的函數(shù)被視為一等類型,它們可以作為參數(shù)傳遞,從其它函數(shù)返回值,或分配給一個(gè)變量。

在下面的F#代碼片段中,我首先定義了一個(gè)函數(shù)(increment),給傳遞來(lái)的值加1,然后,我定義了函數(shù)handler,它使用類型myfunc,使用2作為它的參數(shù),最后,我使用一個(gè)遞增的參數(shù)調(diào)用這個(gè)函數(shù)處理程序,函數(shù)increment作為一個(gè)有規(guī)則的值傳遞,因此它被認(rèn)為是一等類型。

  1. let increment xx = x + 1  
  2. let handler myfunc = (myfunc 2)     
  3. printfn "%A" (handler increment)  
  4.  

注意上述代碼中的類型推斷,F(xiàn)#將會(huì)推斷x是一個(gè)整型(int),因?yàn)槲医o它加了1,下面是使用Scala語(yǔ)法編寫的代碼:

  1. def increment(x:Int) = x + 1  
  2. def handler( f:Int => Int) = f(2)  
  3. println( handler( increment ))  
  4.  

懶散式賦值

F#支持懶散式賦值(lazy evaluation),但由于性能原因,這項(xiàng)特性默認(rèn)并沒(méi)有開(kāi)啟,相反,F(xiàn)#支持所謂的主動(dòng)賦值(eager evaluation),用關(guān)鍵字lazy明確標(biāo)記函數(shù)為懶散函數(shù),運(yùn)行程序時(shí)指定Lazy.fore選項(xiàng)。

  1. let lazylazyMultiply = lazy ( let multiply = 4 * 4  )  
  2.  

和F#一樣,Scala默認(rèn)也不支持懶散賦值,但和F#不一樣的是,Scala是用lazy關(guān)鍵字標(biāo)記值,而不是標(biāo)記函數(shù)。

  1. def lazyMultiply(x: => y:) = { lazy val y = x * x }  
  2.  

#p#

局部套用函數(shù)

局部套用函數(shù)是函數(shù)式編程語(yǔ)言的基本功能,允許應(yīng)用程序的部分函數(shù)和操作組合,F(xiàn)#支持局部套用函數(shù),下面是F#中局部套用函數(shù)的一個(gè)示例。

聲明:

  1. val add : int -> int -> int  
  2.  

實(shí)現(xiàn):

  1. let add = (fun x -> (fun y -> x + y) )  
  2.  

在Scala中,局部套用函數(shù)的樣子有所不同:

  1. def add(x:Int)(y:Int) = x + y  
  2.  

Lambda表達(dá)式

F#也支持Lambda表達(dá)式(匿名函數(shù)),在F#中,Lambda表達(dá)式是使用關(guān)鍵字fun聲明的,在下面的例子中,一個(gè)匿名函數(shù)應(yīng)用給一串遞增的數(shù)字,返回一串新的遞增數(shù)字。

  1. let list = List.map (fun i -> i + 1) [1;2;3]   
  2. printfn "%A" list  
  3.  

Scala中的Lambda表達(dá)式非常時(shí)尚簡(jiǎn)潔,下面是用Scala語(yǔ)法重寫的代碼:

  1. val list = List(1,2,3).map( x => x + 1 )   
  2. println( list )  
  3.  

模式匹配

模式匹配是函數(shù)式編程語(yǔ)言的一個(gè)強(qiáng)大功能,可根據(jù)值或表達(dá)式的類型激活函數(shù)中的代碼塊(可將模式匹配看作是功能更強(qiáng)大的case語(yǔ)句)。

在F#中,使用垂直分隔符(|)表示一個(gè)case選擇器,下面是Fibonacci(斐波納契)數(shù)字函數(shù)的F#實(shí)現(xiàn)。

  1. let rec fib n =  
  2.      match n with  
  3.      | 0 -> 0  
  4.      | 1 -> 1  
  5.      | 2 -> 1  
  6.      | n -> fib (n - 2) + fib (n - 1)  
  7.  

和F#一樣,Scala也支持模式匹配,下面是Fibonacci(斐波納契)數(shù)字函數(shù)的Scala實(shí)現(xiàn),注意Scala使用了case關(guān)鍵字。

  1. def fib( n: Int): Int = n match {  
  2.     case 0 => 0  
  3.     case 1 => 1  
  4.     case _ => fib( n -1) + fib( n-2)  
  5.   }  
  6.  

列表推導(dǎo)

最初出現(xiàn)在Haskell(另一個(gè)函數(shù)式編程語(yǔ)言原型)中,列表推導(dǎo)是數(shù)學(xué)術(shù)語(yǔ),使用基于符號(hào)的表達(dá)式定義列表,例如,在Haskell中,使用以下列表推導(dǎo)生成一串只包含大于2的數(shù)字的平方值。

  1. squares = [ x*x | x <- nums, x > 2 ]  
  2.  

F#中與列表推導(dǎo)相同的功能叫做發(fā)生器,它既可用于列表也可用于序列,在函數(shù)式編程語(yǔ)言中,序列與列表類似,但序列中的元素是在請(qǐng)求時(shí)才計(jì)算出來(lái)的(如,1…1000),存儲(chǔ)效率更好。

列表發(fā)生器的格式如下:

  1. [for x in collection do ... yield expr]  
  2.  

序列發(fā)生器的格式如下:

  1. seq {for x in collection do ... yield expr}  
  2.  

因此前面的Haskell列表推導(dǎo)示例用F#語(yǔ)法重寫后,就應(yīng)該是:

  1. del list = [for x in 0..100 if x > 2 do yield x*x]  
  2.  

在Scala中,列表推導(dǎo)的結(jié)構(gòu)如下:

  1. val type = for ( range ) [if (condition)] ) yield result  
  2.  

下面是用Scala語(yǔ)法重寫后的版本:

  1. val list = for (i <- 1 to 100; if (i > 2)) yield i*i  
  2.  

通過(guò)混合實(shí)現(xiàn)多重繼承

F#和Scala之間一個(gè)最明顯的區(qū)別是F#不支持多重繼承,在Scala中,程序員可以從主類聲明子類擴(kuò)展,也可以繼承其它類的特性。

在所謂的混合類中,子類通過(guò)mixin繼承,在下面的例子中,OtherParentClass就被用作mixin。

  1. Class MixinSubclass extends BaseClass with OtherParentClass  
  2.  

基類使用extends關(guān)鍵字聲明,混合則使用with關(guān)鍵字聲明。

繼承的方法使用關(guān)鍵字override明確覆蓋以防發(fā)生意外。

  1. override def calculate(dx: Int, dy: Int): Distance =  
  2.     new Distance(x + dy, y + dy )  
  3.  

OtherParentClass應(yīng)該使用關(guān)鍵字trait聲明:

  1. trait OtherParentClass  
  2.       def count:Int  
  3.       def kmDistance = count * 1.66  
  4.  

小結(jié)

除了Scala混合功能外,F(xiàn)#和Scala提供的功能都很相似,它們都非常靈活,都是很強(qiáng)大的函數(shù)式編程語(yǔ)言,本文只對(duì)這兩個(gè)編程語(yǔ)言最基本的編程功能做了簡(jiǎn)略的比較,在下一篇文章中,我將會(huì)比較它們的最大不同點(diǎn):應(yīng)用程序開(kāi)發(fā)模型和運(yùn)行時(shí)功能。

原文出處:www.developer.com/features

原文名:Scala vs. F#: Comparing Functional Programming Features

作者:Edmon Begoli

【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文出處、作者及51CTO譯稿和譯者!】

【編輯推薦】

  1. Scala vs F#:函數(shù)式編程特性大比拼(二)
  2. Scala:Java+函數(shù)式=后函數(shù)式?
  3. F#終于支持Silverlight 4 四大新特性一覽
  4. Scala代碼編寫中常見(jiàn)的十大陷阱
  5. F#中關(guān)于代理的基本使用
  6. 最容易令初學(xué)者混亂的F#命令

 

責(zé)任編輯:楊鵬飛 來(lái)源: 51CTO獨(dú)家譯文
相關(guān)推薦

2010-07-09 14:12:00

ScalaF#C#

2010-01-07 10:04:18

F#函數(shù)式編程

2011-06-09 09:52:41

F#

2009-02-06 14:26:37

UbuntuVistaWindows7

2011-12-06 09:55:03

Ubuntu vs.F性能測(cè)試

2011-01-19 11:10:30

2010-03-18 14:54:46

主流無(wú)線技術(shù)

2018-06-08 11:05:00

2010-07-14 13:38:51

Perl開(kāi)發(fā)工具

2020-08-04 17:06:40

Merging Rebasing Git

2021-03-02 09:00:00

開(kāi)源框架技術(shù)

2010-06-01 14:39:15

NoSQL

2016-03-15 13:08:57

Linux桌面環(huán)境LXDE

2013-06-13 16:03:23

iOS7WWDC蘋果

2017-09-10 14:29:03

眼力

2010-09-08 15:41:28

SIP協(xié)議棧

2010-05-28 11:09:51

SVN功能

2011-11-08 10:29:44

2014-01-07 17:08:02

Java開(kāi)源框架

2023-05-26 15:53:48

MidjourneyAI圖像
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜在线视频一区二区三区 | 成人高清视频在线观看 | 成人综合视频在线 | 久婷婷| 精品国产高清一区二区三区 | 精品乱码一区二区 | 一本色道精品久久一区二区三区 | 亚洲视频免费观看 | 欧美日韩综合精品 | 国产精品一区一区三区 | 日韩精品免费视频 | 精品国产一区二区三区观看不卡 | 国产高清视频在线 | 一级黄色片在线免费观看 | 亚洲一区二区久久 | 一区二区三区观看视频 | 欧美视频区 | 欧美综合国产精品久久丁香 | 亚洲国产精品va在线看黑人 | 免费能直接在线观看黄的视频 | 欧美三级成人理伦 | 久久婷婷av | 午夜激情影院 | av乱码| 麻豆精品久久久 | 欧洲尺码日本国产精品 | 欧美一区二区三 | 久久国产麻豆 | 色噜噜狠狠色综合中国 | 一级黄色在线 | 久久久噜噜噜www成人网 | 午夜久久久久久久久久一区二区 | 久久久久国产一区二区三区 | 一区二区中文 | 国产美女网站 | 精品美女久久久 | 少妇一级淫片免费播放 | 91av免费版 | 欧美日韩一区在线观看 | 国产精品亚洲欧美日韩一区在线 | 精品国产不卡一区二区三区 |