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

最容易令初學(xué)者混亂的F#命令

開發(fā) 開發(fā)工具
F#是一門函數(shù)式編程語言,函數(shù)式編程語言的特點(diǎn)之一便是No Side Effect,Immutable。但是在很多場景下,Mutable可以給我?guī)砗芏啾憷绕涫窃诮Y(jié)合命令式編程的場景中。

而對(duì)于F#的初學(xué)者,或是C#和F#混用的程序員來說,我認(rèn)為F#中最容易令人混亂的命令是Reference Cells的取值操作了。下面便詳細(xì)談?wù)勥@么說的原因,及建議的應(yīng)對(duì)辦法。

F#是一門函數(shù)式編程語言,函數(shù)式編程語言的特點(diǎn)之一便是No Side Effect(無副作用),Immutable(不可變)。但是在很多場景下,Mutable(可變)可以給我?guī)砗芏啾憷绕涫窃诮Y(jié)合命令式編程的場景中。因此F#提供了將某個(gè)“標(biāo)識(shí)符”定義為“可變”的方式,主要有兩種:使用mutable關(guān)鍵字或是Reference Cells。

在大部分情況下,我推薦(微軟也這么推薦的)使用mutable關(guān)鍵字,因?yàn)檫@樣標(biāo)識(shí)符在使用上也已經(jīng)和普通變量沒有任何區(qū)別了。與之相對(duì),使用Reference Cell進(jìn)行讀寫操作都需要一些特殊的操作/指令。不過的確有一些場景必須使用Reference Cells,您可以關(guān)注MSDN上的說明。例如,在mutable的標(biāo)識(shí)符在讀取和賦值時(shí),和普通的屬性沒有什么區(qū)別:

  1. let mutable a = 0 
  2. <- 1 // assign mutable variable  
  3. let request = WebRequest.Create("http://m.ekrvqnd.cn")  
  4. request.ContentType <- "text/xml" // assign property 

但是對(duì)于Reference Cells來說,它的讀取和寫入就需要使用!與:=操作符了:

  1. let a = ref 0  
  2. :1 // assign value  
  3. printfn "%i" !a // retrieve value 

這個(gè)感嘆號(hào)便是引起混亂的源泉,且看以下代碼:

  1. let transfer (streamIn: Stream) (streamOut: Stream) buffer =  
  2.     let hasData = ref true  
  3.     while !hasData do  
  4.         let lengthRead = streamIn.Read(buffer, 0, buffer.Length)  
  5.         if lengthRead > 0 then   
  6.             streamOut.Write(buffer, 0, lengthRead)  
  7.         else  
  8.             hasData :false 

上面的代碼定義了一個(gè)transfer函數(shù),將一個(gè)數(shù)據(jù)流中的數(shù)據(jù)全部傳輸?shù)搅硪粋€(gè)數(shù)據(jù)流中。在這里我們使用了命令式的編程方式,并使用一個(gè)名為hasData的Ref Cell來表明是否讀完了數(shù)據(jù)。

不過,您看到while語句中的!hasData是什么感覺?至少對(duì)于我這樣混寫C#和F#的人來說,我的***反應(yīng)是“嗯,取反?”,然后才是“哦,只是Ref Cells的取值操作”。對(duì)于其他一些場景下可能這點(diǎn)不會(huì)成為問題,但如果這個(gè)Ref Cell是個(gè)布爾值,然后又放在if或while的時(shí)候,混亂就這樣開始了。因此,我目前可能會(huì)傾向于使用這樣的方式:

  1. let transfer (streamIn: Stream) (streamOut: Stream) buffer =  
  2.     let hasData = ref true  
  3.     while hasData.Value do  
  4.         let lengthRead = streamIn.Read(buffer, 0, buffer.Length)  
  5.         if lengthRead > 0 then   
  6.             streamOut.Write(buffer, 0, lengthRead)  
  7.         else  
  8.             hasData :false 

在F#中,一個(gè)Ref Cell其實(shí)是一個(gè)Ref<'a>類型的對(duì)象,它有一個(gè)'a類型(泛型類型)的Value屬性,可讀寫。因此,如果我們?cè)谏厦娴拇a中直接使用Value屬性,那么我想就不會(huì)讓任何人混亂了。當(dāng)然,***的辦法可能還是寫一些immutable的代碼吧,例如:

  1. let rec transfer (streamIn: Stream) (streamOut: Stream) buffer =  
  2.     let lengthRead = streamIn.Read(buffer, 0, buffer.Length)  
  3.     if lengthRead > 0 then  
  4.         streamOut.Write(buffer, 0, lengthRead)  
  5.         transfer streamIn streamOut buffer 

對(duì)于F#來說,這樣的(尾)遞歸和之前的實(shí)現(xiàn)方式可以說是完全等價(jià)的。

【編輯推薦】

  1. F#中的異步及并行模式:反饋進(jìn)度的事件
  2. F#中的異步及并行模式:代理的高級(jí)使用
  3. F#簡明教程三:F#語法精要
  4. F#簡明教程二:F#類型系統(tǒng)和類型推斷機(jī)制
  5. 詳細(xì)介紹Visual Studio 2010F#使用
責(zé)任編輯:王曉東 來源: 老趙的博客
相關(guān)推薦

2017-03-10 17:00:28

編程語言

2024-03-11 18:17:18

Python字符串分隔符

2018-02-23 10:03:30

Linux命令mkdir

2015-03-13 11:10:03

PHP初學(xué)者PHP知識(shí)點(diǎn)PHP困惑

2018-04-08 14:47:06

Linux命令type

2018-05-14 08:53:51

Linux命令shuf

2018-02-05 08:45:00

RHELCentOS 7MariaDB

2018-02-10 07:36:20

Linux命令wc

2021-08-05 14:40:45

操作系統(tǒng)UNIXLINUX

2018-02-25 14:00:07

Linux命令whereis

2011-09-16 09:38:19

Emacs

2022-04-24 15:21:01

MarkdownHTML

2011-04-12 10:13:24

2018-03-12 19:43:48

Linux命令 ldd

2011-07-04 14:14:54

java

2009-09-28 09:45:00

CCNA學(xué)習(xí)經(jīng)驗(yàn)CCNA

2022-10-10 15:28:45

負(fù)載均衡

2015-07-20 13:56:59

SDN

2020-09-08 19:03:41

Java代碼初學(xué)者

2022-07-22 13:14:57

TypeScript指南
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 99re热精品视频 | 91麻豆精品国产91久久久久久 | 成人影院在线 | 国产一区中文字幕 | 国产一级特黄真人毛片 | 亚洲天堂日韩精品 | 中文字幕欧美日韩一区 | 亚洲国产成人久久综合一区,久久久国产99 | 91精品国产乱码久久久久久久久 | 91亚洲精品在线 | 一区二区三区四区电影视频在线观看 | 精品一区二区av | 日韩欧美在线观看一区 | 日本黄色片免费在线观看 | 日韩成人精品一区 | av一区二区三区四区 | 亚洲第一成人影院 | 日本高清视频在线播放 | 日韩欧美第一页 | 福利片在线 | 日韩在线免费视频 | 久久精品国产99国产精品亚洲 | 狠狠操狠狠操 | 成年网站在线观看 | 亚洲a在线观看 | 日本一区二区在线视频 | 欧美精品成人 | 在线观看亚洲 | 狠狠色综合网站久久久久久久 | 久久大| 精品一区二区久久 | 91精品国产综合久久久久久蜜臀 | 成人精品在线视频 | 日韩在线观看网站 | 久久久91精品国产一区二区三区 | 婷婷国产一区二区三区 | 亚洲一区不卡 | 久久久久久艹 | 精品欧美一区二区三区久久久 | 免费在线观看av片 | 亚洲欧美视频在线观看 |