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

結合實例理解F#函數式語言中的函數

開發 后端
今天筆者來講講函數,函數在函數式編程中起著非常重要的作用,可以夸張一點來說,如果你了解并能熟練應用函數,你就可以向別人說“我精通F#函數式語言了"。

經常有人覺得F#難懂難用,我覺得一部分原因是F#函數式語言中的函數接口(這里的接口指的是function signature, 我習慣叫它函數接口,如果對您閱讀帶來什么不便,請見諒).  看起來和我們平常熟悉的很不一樣(比如C#),導致一些朋友在嘗鮮階段遇到困難,進而覺得其難懂難用,***徹底將F#打入冷宮。希望下面的內容能讓大家覺得F#的函數不再難懂

還是老規矩,先來看一個例子

  1. let res = Seq.unfold (fun (a,b) ->Some(a,(a+b,a))) (0,1)  
  2. Seq.iter(fun x -> printf "%d " x) ( Seq.take 10 res) 

(這個例子中用到了F#中一個基本的immutable類型Seq<'T>, 你可簡單的把它等同于C# 3.0中鼎鼎大名的IEnumerable , 由于這不是本文的重點,所以略去不表)

這段代碼是運行結果是
0 1 1 2 3 5 8 13 21 34 (注意第二行的后面,我只取了sequence的前10個元素,Seq.take 10 res).看到輸出結果,我想大家都明白了這個程序***行是在生成Fibonacci數列,讓我們來看一下Seq.unfold方法的接口

val unfold: ('State -> ('T * 'State) option) -> 'State -> Seq<'T>

我想很多人在初學F#時看過這樣的函數接口說明會感到很陌生吧,沒關系,這正是本文的目的,讓你對其不再陌生。

F#使用箭頭 "->"來標記函數接口,比如 int -> string 就表示這是一個接受一個int型參數并返回一個string值的函數。比如 let f (x:int) = x.ToString()

了解了這個好象并不能幫助我們來理解Seq.unfold方法的接口,要理解它,我們還需要了解一些基本概念。

Higher-Order Function. 有可能以前你沒聽說過這種提法,但不要被這個陌生的名字嚇到,其實我們大家在中學時就接觸過這個東西了,不信你看這個sin(x+y) = sinxcosy+cosxsiny。三角和角公式,這個大家總該有些記憶吧? 有人要問這和Higher-Order Function有什么關系呢?別急,讓我們先看看Higher-Order Function的定義。SICP 里是這樣定義的:Procedures that manipulate procedures are called higher-order procedures。(定義里的procedures就是我們這里說的Function的意思).定義中提到的操作(manipulate)函數不由讓我們想入非非,怎么樣操作函數?把函數當作普通的參數來理解不就簡單多了,( 簡單點就是一個函數接受的參數可以是函數,它的返回值也可以是函數)。那為什么要叫Higher-Order procedures呢?你的老板可以成天讓你做這個干那個,你能反過來指揮你老板做事么J 再看下我上面說的三角和角公式,把sin和cos都看成是函數的話,呵呵,是不是我們在高中就接觸過Higher-Order Function了?

有了Higher-Order Function的概念,好象還是不能讓我們很快看明白Seq.unfold該怎么用。讓我們接著來看一個簡單的函數

let add x y = x+y ( 我們看到這個函數的接口是val add: int -> int -> int)

讓我們接著分析一下這個簡單的方法,F#中箭頭"->“來表示一個函數,并且它是從右到左結合的,所以我們可以把int->int->int看成int->(int->int),結合剛剛說過的Higher-Order Function,這個就變得很易容易理解了,Add接受一個int型參數,返回一個 int->int的函數。讓我們根據這個把add來改寫一下使其更直觀一些
let add x y = (fun x -> (fun y -> x+y) )   (這個很容易讀懂了吧? 接受一個參數x,返回一個函數 fun y -> x+y,返回的函數接受一個參數y,并且返回x+y的值。)
有了上面的基礎,讓我們更進一步,
let add10 = add 10

我想這個大家應該都能看明白了吧, let add10 =  (fun x -> (fun y -> x+y)) 10 = fun y -> 10+y。類似于add10這種用法,在F#中叫做Currying Fuction, 這里的curry跟咖哩沒任何關系,它和Haskell語言的命名一樣,都是為了紀念著名邏輯學專家Haskell Curry,當然currying function也不是F#獨用的,實際上你幾乎可以在任何函數式語言上看到它的身影。

講了這么多了,讓我們回到最開始的例子,
val unfold: ('State -> ('T * 'State) option) -> 'State -> Seq<'T>
現在這個看起來沒前面那么難了吧, unfold方法接受一個('State -> ('T * 'State) option)的參數,返回一個接受'State并返回Seq<'T>的函數。接受的('State->('T *'State) option)的參數又是什么? 當然是一個接受'State參數并返回 ('T * 'State) option的函數。接著我們采用笨辦法來理解let res = Seq.unfold (fun (a,b) ->Some(a,(a+b,a))) (0,1)一一對應之,(a,b)對應于'State,  Tuple(a,(a+b,a))中逗號前的a對應于'T,后面的(a+b,a)對應于 'T*'State,因為我們看到接口說明中是('T * 'State) option,所以我們相應的加上Some關鍵字(有關option type,參見上一篇),后半部分我就不多解釋了,通過一一對應,我們看到Seq里存的值是Tuple(a,(a+b,a))中的***項,也就是逗號前的a了。這下你明白怎么讀懂一個函數接口了吧?

如果你剛剛開始學F#,請做幾個練習鞏固一下今天學的知識吧?你能根據下面所寫的函數接口構造一個函數么?

  1.  'a -> ('a->'b)->'b  
  2. ('a->'b) ->('c -> 'a) -> 'c -> 'b  
  3. (’T -> bool) -> ‘T list -> ‘T list 

F#函數式語言總結

1.F#函數式語言中每個函數都有一個返回值,這個返回值可以是具體的值,也可以是另一個函數(unit表示函數返回值為空(void)). 當在讀一個函數接口說明時,最右面箭頭"->"后面的部分,表示的就是該函數的返回值。F#中的每個函數都只能接受一個參數,同樣,這個參數可以是具體的值,也可以是一個參數。

2. Higher-Order function 和Currying function是理解并能熟練運用函數式編程的重要基石,希望還不太明白的朋友能好好理解我上面的例子,把基礎打好。

本文來自芭蕉博客園文章《結合實例實習F#(三)--理解函數式語言中的函數

【編輯推薦】

  1. F#入門:基本語法,模式匹配及List
  2. C# Actor的尷尬與F#美麗外表下的遺憾
  3. 函數式編程語言F#:基于CLR的另一個頭等編程語言
  4. Visual Studio 2010爆F#二進制兼容性問題
  5. 推薦Visual Studio 2010中F#的一些資源
責任編輯:彭凡 來源: 博客園
相關推薦

2011-06-09 09:52:41

F#

2010-01-07 10:04:18

F#函數式編程

2009-11-09 17:51:51

F#函數式編程

2009-06-22 13:43:01

F#函數式編程

2010-07-07 13:11:20

ScalaF#C#

2010-07-09 14:12:00

ScalaF#C#

2011-03-30 11:01:13

C語言隨機

2010-07-19 10:01:57

Perl函數

2010-01-26 08:25:06

F#語法F#教程

2019-07-11 08:00:00

JavaScriptJulia編程語言

2010-01-25 17:05:37

C++語言

2009-12-11 13:59:35

F#

2010-01-18 13:54:28

函數

2021-10-14 15:34:48

C語言字符串函數

2010-04-07 16:51:59

F#

2009-12-11 10:44:00

Scala講座函數 scala

2023-10-27 11:21:20

C語言Multics語言

2021-12-06 11:19:47

語言指針內存

2010-09-06 15:17:14

Sql函數

2022-01-06 14:25:24

C語言指針內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本午夜免费福利视频 | 欧美日韩高清 | 国产日韩91| 国产女人与拘做受免费视频 | 久久精品91久久久久久再现 | 久久99精品久久久久婷婷 | 天天射网站| 国产精品欧美一区二区 | 国产最好的av国产大片 | 天天夜夜人人 | 久久99精品久久久久婷婷 | 一区二区免费在线观看 | 我爱操 | 成人小视频在线观看 | 精品免费国产一区二区三区 | 国产精品视频一区二区三区 | 国产伦精品一区二区三区照片91 | 午夜在线免费观看 | 国产视频一区在线 | 欧洲尺码日本国产精品 | 日韩综合在线视频 | 国产免费一区二区 | 日一日操一操 | 国产成人精品一区二区 | 欧美在线a| 欧美精品一区三区 | 亚洲高清视频一区二区 | 男人av网 | 波多野结衣一区二区 | 欧美成人免费在线视频 | 亚洲伊人精品酒店 | a级片www| 欧美成人精品一区二区男人看 | 性一交一乱一透一a级 | 久久九| 亚洲成人免费 | 美女爽到呻吟久久久久 | 午夜精品一区二区三区在线播放 | 精品国产欧美一区二区 | 亚洲 欧美 日韩在线 | 国产免国产免费 |