日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

F#初学笔记08

發(fā)布時(shí)間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 F#初学笔记08 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
惰性求值 惰性求值也叫按需調(diào)用,是一個(gè)演算策略,延遲一個(gè)表達(dá)式的演算,直到需要用到演算值的時(shí)候再演算,同時(shí)也避免了重復(fù)演算。 惰性求值的好處包括: 避免不必要的計(jì)算,提升性能。 可以構(gòu)造以構(gòu)造一個(gè)無限的數(shù)據(jù)結(jié)構(gòu) 可以定義控制流的抽象類。 惰性求值由于僅僅在需要的時(shí)候才求值,所以它可以縮小內(nèi)存的訪問范圍。但是惰性求值處理異常,輸入輸出的時(shí)候卻有困難,因?yàn)榇a操作的順序無法得知,惰性求值可能引起內(nèi)存泄漏。 惰性求值和函數(shù)式編程關(guān)系密切。如果沒有語言中沒有副作用,編譯器或可以自由的選擇表達(dá)式的演算順序。F#允許函數(shù)有副作用,所以在函數(shù)演算時(shí),編譯器不可能自由選擇,因此,可以說F#有嚴(yán)格的演算順序,是一個(gè)嚴(yán)格的語言。你仍然可以利用惰性求值,但是必選顯式表面哪些計(jì)算可以延遲,也就是哪些按照惰性的方法來演算。 惰性求值的相對的就是及早求值(Eager evaluation),也稱嚴(yán)格求值。
? 使用關(guān)鍵字lazy來延時(shí)計(jì)算,延遲計(jì)算的表達(dá)式一直不演算,直到顯式的對其使用force函數(shù)。當(dāng)force函數(shù)用于由于惰性表達(dá)式,值就馬上計(jì)算,結(jié)果會被緩存起來。后面再調(diào)用force函數(shù),則返回這個(gè)緩存值,即使可能引起異常。 下面的代碼演示了惰性求值。
? let lazyValue = lazy ( 2 + 2 ) let actualValue = Lazy.force lazyValue printfn "%i" actualValue
? 第一行延遲計(jì)算了一個(gè)簡單表達(dá)式,下一行強(qiáng)制計(jì)算,最終,打印出值。 這個(gè)值被緩存了,所以這個(gè)值僅在第一次強(qiáng)制惰性求值的時(shí)候計(jì)算,這很容易演示,如下:
? let lazySideEffect =lazy( let temp = 2 + 2printfn "%i" temptemp ) printfn "Force value the first time: " let actualValue1 = Lazy.force lazySideEffect printfn "Force value the second time: " let actualValue2 = Lazy.force lazySideEffect
上例中,強(qiáng)制計(jì)算2次值,但是此副作用值發(fā)生一次。運(yùn)行結(jié)果如下:

?

惰性求值在操作集合的時(shí)候很有用,惰性集合的概念就是集合中的元素僅在需要的時(shí)候才計(jì)算。一些集合類型也會緩存計(jì)算結(jié)果,所以也不需要重復(fù)計(jì)算元素。

注意,此處用?Lazy.force因?yàn)樽髡呖赡苁褂玫?/font>OCaml,在F#從?OCaml 風(fēng)格轉(zhuǎn)到C#風(fēng)格之前?,F(xiàn)在用x.Value?或者x.Force()替代。由于某些原因F#現(xiàn)在在PowerPack中。F# PowerPack是由微軟的F#團(tuán)隊(duì)提供的編譯器和核心庫。http://fsharppowerpack.codeplex.com/

創(chuàng)建惰性集合,最重要也是最難的可能要數(shù)unfold。此函數(shù)允許你建立惰性List。難點(diǎn)在于你必須提供一個(gè)函數(shù),此函數(shù)用于重復(fù)計(jì)算以提供元素。這個(gè)傳遞給Seq.unfold的函數(shù)可以接受任何類型的參數(shù),并且必須返回一個(gè)option類型。option類型是一個(gè)union類型,可以是None或者Some(x),x是任何類型的值。None代表list的結(jié)束。Some 結(jié)構(gòu)必須包含一個(gè)元組。第一個(gè)元素是list中的第一個(gè)值,第二個(gè)值是下一次調(diào)用的時(shí)候要傳給函數(shù)的值。你可以認(rèn)為這個(gè)值是一個(gè)累加器。
? 看一個(gè)例子就明白,標(biāo)識符lazyList,如果傳遞給函數(shù)的值小于13,追加到list,然后把值加1傳遞給list。這個(gè)值將是下一次調(diào)用的時(shí)候傳遞給函數(shù)的。如果這個(gè)值大于等于12,返回None,終結(jié)這個(gè)list。
? // the lazy list definition let lazyList =Seq.unfold(fun x ->if x < 13 then// if smaller than the limit return// the current and next valueSome(x, x + 1)else// if great than the limit// terminate the sequenceNone)10 // print the results printfn "%A" lazyList 結(jié)果就是 10,11,12 Sequences用來表示list,如果內(nèi)存無限多,那么也就可以有無限多元素。下面的例子演示創(chuàng)建一個(gè)Fibonacci數(shù)列。由于使用了bigint,不受32-bit整型限制,可以計(jì)算更多的數(shù)字。為了演示方便,使用函數(shù)?Seq.take返回前20個(gè)元素到F#的list中。
? // create an infinite list of Fibonacci numbers let fibs =Seq.unfold(fun (n0, n1) ->Some(n0, (n1, n0 + n1)))(1I,1I) // take the first twenty items from the list let first20 = Seq.take 20 fibs // print the finite list printfn "%A" first20 計(jì)算結(jié)果: [1I; 1I; 2I; 3I; 5I; 8I; 13I; 21I; 34I; 55I; 89I; 144I; 233I; 377I; 610I; 987I; 1597I; 2584I; 4181I; 6765I]

總結(jié)

以上是生活随笔為你收集整理的F#初学笔记08的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。