精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

F#運算符定義規則總結

開發 后端
在這里我們將總結F#運算符定義規則,希望通過本文,能為大家打開一扇通往F#的窗口。

本文將討論的是F#運算符相關定義規則的問題,這些規則覆蓋大多數開發場景。希望通過本文能對大家了解F#運算符規則有所幫助。

#T#

F#允許開發人員定義或重載各類運算符,合理利用這一規則可以讓編程變得方便,讓代碼更容易閱讀。例如,在使用F#的MailboxProcessor的時候,我會習慣于定義一個運算符來代替顯式的Post操作:

  1. let (>>) m (agent: MailboxProcessor<_>) = agent.Post m 

這樣便可以這樣發送消息:

  1. let agent = MailboxProcessor.Start(fun o -> async { o |> ignore });  
  2. "hello world" >> agent 

不過,F#的運算符定義規則較為復雜,要搞清楚編譯器的整體處理方式著實花費了一番功夫。比較奇怪的是,即便是《Expert F#》中對于這個話題也沒有詳細的敘述——更夸張的是MSDN的文檔也相當馬虎,甚至有代碼缺失以及與試驗不符情況(因為還沒有正式發布?)。于是我連看帶試,最終打算總結一番,作為備忘的同時也算是補充互聯網資源。

運算符重載

F#中允許在global級別重載一個運算符,甚至“覆蓋”原有的定義。例如,我們可以寫一個Operator模塊,其中只有一個“加號”的定義:

  1. // operator.fs  
  2. #light  
  3. module Operator  
  4. let (+) (a:int) (b:int) = a * b 

我們可以在另一個模塊中引入Operator模塊,于是兩個整數的“加法”便可以得出乘法的效果了:

  1. 1 + 2 |> printfn "%i" // 2 

從中也可以看出,胡亂重載運算符實在是一種沒事找事的方式。因此,現在這篇文章純粹都是在“談技術”,所有的內容,包括示例都不代表“***實踐”。

運算符的組成

在F#中,自定義運算符可以由以下字符組成:

  1. ! % & * + - . / < = > ? @ ^ | ~ 

目前在MSDN中,《Operator Overloading (F#)》一文寫到“$”也可以作為運算符的組成,不過***的F#編譯器(v1.9.7.4)中會對此作出“警告”,表示以后它將成為一個F#的保留字,不允許用作運算符。

在F#中,每個運算符不限長度。也就是說,如果您喜歡的話,完全可以定義這樣的一個運算符來表示整數加法:

  1. let (!%&*+-./<=>?@^|~!%&*+-./<=>?@^|~) (x : int) (y : int) = x * y 

F#會將運算符編譯為程序集中具體的方法,其命名遵循一定規則。不過在使用時我們并不需要關心這些。如果您對這方面的具體信息感興趣,可以參考MSDN中《Operator Overloading (F#)》一文。

前綴與中綴運算符

前綴(prefix)運算符,表示運算符出現在運算數之前,例如“負號”便是個前綴運算符:

  1. let a = 1  
  2. -a |> printfn "%i" // -1 

中綴(postfix)運算符,表示運算符出現在兩個運算數之間,例如最常見的“加法”便是個中綴運算符:

  1. 1 + 2 |> printfn "%i" // 3 

在自定義運算符時,F#并不允許我們指定某個運算符是前綴還是中綴運算符,編譯器會自動根據運算符的“首字母”來決定它是前綴還是中綴的。例如,首字母為“感嘆號”的運算符便是“前綴”運算符:

  1. let (!+) (x:int) (y:int) = x + y 

根據這個規則,我們只能將“!+”作為前綴運算符來使用:

  1. 1 (!+) 2 |> printfn "%i" // 編譯失敗!  
  2. !+ (!+ 1 2) 3 |> printfn "%i" // 6 

關于某個字母表示前綴還是中綴運算符,您可以參考《Operator Overloading (F#)》一文中的表格。可以發現,大部分運算符都是中綴的,而只有少數是前綴運算符。至于后綴運算符……F#并不支持后綴運算符。

F#運算符的優先級

每個運算符有其自己的優先級(precedence),優先級表示一個表達式中連續出現多個運算符時,究竟哪個運算符先生效。例如,我們都知道“先乘除后加減”:

3 + 4 * 5 |> printfn "%i" // 23那么,我們自定義的運算符優先級又如何呢?F#同樣是通過運算符的首字母來決定它的優先級的,關于不同首字母的優先級高低,可以參考MSDN中《Symbol and Operator Reference (F#)》的Operator Precedence一節,它按照優先級從低到高列舉所有的運算符。

例如“除號”的優先級比“加號”高,因此:

  1. let (+/) (x:int) (y : int) = x / y  
  2. let (/+) (x:int) (y : int) = x + y  
  3. 4 + 4 / 2 |> printfn "%i" // 6  
  4. 4 /+ 4 +/ 2 |> printfn "%i" // 4 

值得注意的是,如果兩個運算符的首字母相同,則F#便認為兩個運算符的優先級相同,而不在比較它們后續字符的優先級高低。不過在優先級的判定中有個特例,那就是“點”,它并不參與優先級的比較中,此時便以后面的字符為準了:

  1. let (.+) (x:int) (y:int) = x + y  
  2. let (..*) (x:int) (y:int) = x * y  
  3. // 仍然是“先乘除后加減”  
  4. 3 .+ 4 ..* 5 |> printfn "%i" // 23  
  5. 3 ..* 4 .+ 5 |> printfn "%i" // 17 

當然,括號可以改變運算符的優先級,這點再正常不過了。還有一點,便是“轉發”操作(即本文代碼中出現的“|>”),它以“|”作為首字母。根據規則,它的優先級是很低的(在自定義運算符中是***的)。因此,無論我們左側的表達式中使用了什么樣的運算符,都是***才進行“轉發”操作。

運算符的相關性

每個運算符都有其相關性(associativity)。相關性的作用是,一旦一個表達式中連續出現優先級相同的運算符,那么它們究竟是從左向右計算(左相關),還是從右向左計算(右相關)。
例如,最普通的“除號”便是左相關的:

  1. 4 / 2 / 2 |> printfn "%i" // 1 

而List操作的“連接符”(連接單個元素與一個列表)便是右相關的:

  1. 1 :: 2 :: 3 :: [] |> printfn "%A" // [1; 2; 3] 

在F#中,運算符的相關性也是由首字母決定的,您可以在MSDN中《Symbol and Operator Reference (F#)》的Operator Precedence一節查到所有字符的相關性。

例如,“大于號”是左相關的,因此:

  1. let (>+) (x:int) (y:int) = x + y  
  2. let (>*) (x:int) (y:int) = x * y  
  3. 3 >+ 4 >* 5 |> printfn "%i" // 35  
  4. 3 >* 4 >+ 5 |> printfn "%i" // 17而“^”是右相關的:  
  5. let (^+) (x:int) (y:int) = x + y  
  6. let (^*) (x:int) (y:int) = x * y  
  7. 3 ^+ 4 ^* 5 |> printfn "%i" // 23  
  8. 3 ^* 4 ^+ 5 |> printfn "%i" // 27 

自然,括號可以改變運算符的相關性。

一元運算符

之前我們討論的大都是二元運算符(即需要兩個運算數),不過有一個字符比較特殊,它便是“~”,我們可以利用它來定義一個“一元運算符”:

  1. let (~-) (x:int) = x + 1  
  2. let a = 1  
  3. -a |> printfn "%i" // 2 

這效果是不是很神奇?因此,如果您要重載現有的運算符,請一定三思而后行。

為類型定義運算符

之前我們一直在討論“全局”級別的運算符。事實上,運算符也可以定義在某個類型內部。例如:

  1. // 定義  
  2. type Rational(numer, denom) =  
  3.  
  4.     member r.Numer = numer  
  5.     member r.Denom = denom  
  6.  
  7.     static member (-) (x:Rational, y:Rational) =  
  8.         let n = x.Numer * y.Denom - y.Numer * x.Denom  
  9.         let d = x.Denom * y.Denom  
  10.         new Rational(n, d)  
  11.  
  12.     static member (~-) (v:Rational) = new Rational(-v.Numer, v.Denom)  
  13.  
  14. // 使用  
  15. let r1 = new Rational(1, 2)  
  16. let r2 = new Rational(2, 3)  
  17. let r3 = r1 - r2  
  18. let r4 = -r1 

至于運算符的優先級、相關性等性質,都與上文描述的保持一致。

原文標題:總結一下F#中運算符的定義規則

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/12/14/fsharp-operator.html

責任編輯:彭凡 來源: 51CTO
相關推薦

2025-02-24 11:16:20

2009-11-18 09:02:55

PHP運算符

2009-08-14 10:16:57

C#運算符重載

2009-11-17 09:13:21

PHP運算符

2010-03-05 10:04:38

Python運算符

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2023-04-10 08:58:13

C#關系運算符

2017-09-05 16:17:35

JavaScript運算轉換

2017-09-13 10:58:51

JavaScript轉換規則

2010-01-26 08:25:06

F#語法F#教程

2010-01-21 17:39:26

VB.NET運算符過程

2010-01-20 14:06:36

VB.NET運算符組合

2009-08-12 11:20:51

C#運算符重載

2016-10-14 14:04:34

JAVA語法main

2009-08-12 09:30:10

C#??運算符

2024-02-26 15:17:20

2009-06-21 13:48:05

ShellLinux運算符

2021-12-15 10:25:57

C++運算符重載
點贊
收藏

51CTO技術棧公眾號

在线观看亚洲免费视频| 麻豆av一区二区| 麻豆changesxxx国产| 红杏视频成人| 在线精品视频一区二区三四 | 秋霞网一区二区| 久久永久免费| 欧美高跟鞋交xxxxhd| 91精品人妻一区二区三区蜜桃欧美| 欧美日韩女优| 午夜精品久久久久久久99水蜜桃| 亚洲精品tv久久久久久久久| 亚洲国产精品一| 日本欧美久久久久免费播放网| 欧美精品成人91久久久久久久| 蜜桃传媒一区二区亚洲| 91成人入口| 欧美日韩一区二区三区在线| 一女被多男玩喷潮视频| 黄色网址在线免费观看| 久久综合久久综合久久综合| 操一操视频一区| 91精品在线视频观看| 国产欧美一级| 欧美人在线观看| 欧美视频一区二区在线| 妖精一区二区三区精品视频| 精品久久久久一区| 亚洲免费成人在线视频| 在线国产成人影院| 欧美日韩精品中文字幕| 99久久国产综合精品五月天喷水| 日p在线观看| 国产三级精品视频| 欧美日韩免费精品| 涩爱av在线播放一区二区| 国产黄人亚洲片| 成人字幕网zmw| 夜夜爽8888| 日本美女一区二区三区| 欧美专区中文字幕| 国产原创视频在线| 国产亚洲精品v| 5278欧美一区二区三区| 日本少妇做爰全过程毛片| 欧美另类女人| 欧美激情视频在线| 久热这里只有精品在线| 欧美1区2区| 欧美猛交免费看| 久久97人妻无码一区二区三区| 欧美激情1区2区| 欧美高清第一页| 国产成人啪精品午夜在线观看| 天天精品视频| 久久99国产精品自在自在app| 欧美精品久久久久久久久46p| 欧美jizz| 欧美第一黄网免费网站| 精品一区在线视频| 夜夜嗨一区二区| 欧美自拍视频在线| 性色av一区二区三区四区| 青青青伊人色综合久久| 国产日韩精品在线播放| 国产视频www| 成人黄色一级视频| 久久久久久久久一区二区| 神马精品久久| 91麻豆精品在线观看| 久久精品国产美女| 国产黄在线观看免费观看不卡| 中文字幕成人av| 中文字幕成人一区| 欧美14一18处毛片| 欧美午夜宅男影院在线观看| 男人的天堂日韩| 国产精品一区二区美女视频免费看| 日韩一区二区三区在线观看| 国产美女视频免费观看下载软件| 久久91精品| 日韩视频永久免费观看| 欧美日韩偷拍视频| 亚洲影院在线| 成人福利在线视频| 欧美自拍偷拍一区二区| 久久人人爽人人爽| av电影一区二区三区| 久久av色综合| 欧美色综合天天久久综合精品| 爽爽爽在线观看| 日韩av网址大全| 日韩在线视频观看正片免费网站| 免费成年人视频在线观看| 亚洲精品1区| 国产精品欧美激情| 国产成人自拍一区| 国产精品国产a级| 国产一区二区网| 亚洲国产91视频| 国产视频精品免费播放| 欧美视频www| 首页综合国产亚洲丝袜| 动漫精品视频| 免费网站成人| 色婷婷综合久久久久中文| 国产亚洲色婷婷久久| 综合综合综合综合综合网| 美女视频久久黄| 中文字幕免费观看| 成人动漫一区二区| 久久av秘一区二区三区| 欧美成人性网| 亚洲国产古装精品网站| 青青草原免费观看| 免费精品99久久国产综合精品| 国产在线一区二区三区四区| 91在线中字| 欧美日韩在线电影| 日本黄色网址大全| 亚洲国产黄色| 91精品网站| 黄页视频在线播放| 精品视频1区2区3区| 鲁大师私人影院在线观看| 国产精品地址| 亚洲自拍小视频免费观看| 色影视在线观看| 欧美在线免费视屏| 国产精品无码一区二区三区| 国产精品日韩久久久| 亚洲自拍小视频免费观看| 免费观看成人高潮| 欧美日韩卡一卡二| 在线看片中文字幕| 日韩和的一区二区| 日本一区二区三区四区在线观看| 国产在线天堂www网在线观看| 欧美成人女星排行榜| 青娱乐在线视频免费观看| 韩国精品久久久| 中文字幕免费高| www.久久久久爱免| 久久久999精品| 国产老女人乱淫免费| 综合久久久久综合| 亚洲欧美一区二区三区不卡| 希岛爱理av一区二区三区| 国产精品最新在线观看| 日本中文在线| 91精品国产aⅴ一区二区| 九九热最新地址| 国产盗摄精品一区二区三区在线| 男人的天堂avav| 国产一区二区三区不卡av| 午夜精品久久久久久久白皮肤| 男人天堂手机在线观看| 午夜视频久久久久久| 亚洲av无码国产精品久久| 水蜜桃久久夜色精品一区的特点 | 无码国产精品一区二区色情男同 | 另类美女黄大片| 999久久久久久| 亚洲成人久久影院| 国产艳俗歌舞表演hd| 男人的天堂亚洲| 亚洲欧美成人一区| 美女精品久久| 性欧美在线看片a免费观看| 三级毛片在线免费看| 欧美性videosxxxxx| 尤物在线免费视频| 国产91精品精华液一区二区三区 | 青娱乐免费在线视频| 成人av网站大全| 热久久精品免费视频| 91九色精品| 国产综合欧美在线看| 欧美va在线观看| 久久69精品久久久久久久电影好| 头脑特工队2免费完整版在线观看| 在线观看日韩一区| 国产高潮流白浆| 91免费国产视频网站| 国产三级国产精品国产专区50| 午夜欧美精品| 色综合久久av| 国产调教精品| 国产欧美日韩中文字幕在线| 国产精品—色呦呦| 尤物99国产成人精品视频| www.桃色av嫩草.com| 在线免费不卡电影| 久久久全国免费视频| 国产亚洲福利社区一区| 一区二区三区四区影院| 日本不卡高清视频| 青青草国产免费| 色综合久久网| 蜜桃久久精品乱码一区二区| 一区二区三区四区免费| 欧美/亚洲一区| 日产精品一线二线三线芒果| 亚洲超碰在线观看| 国产精品久久久久久一区二区 | 福利视频999| 国产欧美日韩亚洲一区二区三区| 最近免费观看高清韩国日本大全| 亚洲精品**不卡在线播he| 91九色蝌蚪成人| 婷婷激情成人| 国产精品久久久久久av福利| 爱草tv视频在线观看992| 久久精品国产视频| 国产h视频在线观看| 亚洲国产小视频在线观看| 91精品国产乱码久久久| 在线欧美日韩国产| 亚洲影院在线播放| 精品动漫一区二区| 久久午夜无码鲁丝片午夜精品| 中文字幕一区视频| 亚洲日本精品视频| 久久久精品免费网站| 极品白嫩丰满美女无套| 成人丝袜高跟foot| 国产无套精品一区二区三区| 国精品**一区二区三区在线蜜桃| 国产精品拍拍拍| 久久九九电影| 欧美精品色婷婷五月综合| 亚洲日本成人| 久久久久免费看黄a片app| 国色天香一区二区| 日本成人在线不卡| 综合五月婷婷| 麻豆传媒网站在线观看| 91高清一区| 日本一道在线观看| 欧美在线日韩| 日本成人在线不卡| 亚洲天堂黄色| 国产av国片精品| 中文一区二区| 女人扒开屁股爽桶30分钟| 性欧美暴力猛交另类hd| 成人在线观看黄| 日本美女一区二区三区视频| 手机看片一级片| 国产资源在线一区| a级大片免费看| 波波电影院一区二区三区| 白嫩情侣偷拍呻吟刺激| 99热这里都是精品| 国产手机在线观看| 国产日韩一级二级三级| 亚洲欧美va天堂人熟伦 | 欧美日韩在线国产| 亚洲大片在线观看| av资源免费观看| 日本电影亚洲天堂一区| 中文资源在线播放| 91精品免费在线观看| 亚洲第一视频在线| 亚洲黄色在线观看| 欧美女子与性| 中文字幕欧美日韩| 色婷婷在线播放| 91干在线观看| 精品九九久久| 国产激情美女久久久久久吹潮| 欧美日韩一区二区三区四区不卡 | 亚洲区自拍偷拍| 国产精品传媒入口麻豆| 免费在线看黄网址| 色素色在线综合| 一本一道人人妻人人妻αv| 日韩亚洲国产中文字幕欧美| 亚洲aaa在线观看| 中文字幕欧美日韩在线| 欧美v亚洲v| 国产成人精品一区| 日韩欧美高清一区二区三区| 精品亚洲一区二区三区四区五区高| 精品不卡一区| 中文精品无码中文字幕无码专区| 午夜在线播放视频欧美| 波多野结衣国产精品| 99国产欧美另类久久久精品| 美国黄色特级片| 激情av一区二区| 国产原创中文av| 亚洲人成电影网站色…| aa在线视频| 国产精品久久久久久久久久久久久久| 美女久久精品| 日韩不卡av| 欧美激情精品久久久六区热门| 日韩av资源在线| 国产a视频精品免费观看| 久久久久亚洲av成人无码电影| 亚洲女同一区二区| 无码一区二区三区| 亚洲成人aaa| h网站久久久| 国产精品日韩在线| 神马午夜久久| 激情六月天婷婷| 久久99久久久欧美国产| www.色天使| 亚洲成a人片综合在线| 一级做a爱片久久毛片| 亚洲欧美一区二区三区久久| 国产探花在线观看| 亚洲一区二区三区毛片| 欧美理论在线播放| 免费在线观看亚洲视频| 国产福利一区在线观看| 中日韩一级黄色片| 在线观看不卡视频| 欧美女同网站| 91av视频在线免费观看| 成人h动漫精品一区二区器材| 在线国产99| 青青草国产成人av片免费| 国产精品嫩草av| 亚洲第一在线综合网站| 国产 日韩 欧美 综合| 美女撒尿一区二区三区| 亚洲欧洲专区| 一区二区三区四区不卡| 青草av.久久免费一区| 色婷婷在线影院| 亚洲国产一区二区视频| 亚洲精品视频专区| 欧美日本高清视频| 超碰cao国产精品一区二区| 无码人妻精品一区二区蜜桃百度| 国产一区二区三区在线观看免费| 精品在线观看一区| 欧美欧美欧美欧美| 日本高清中文字幕在线| 国产美女直播视频一区| 91影院成人| 精品综合久久久久| 亚洲视频一二三区| 99视频国产精品免费观看a| 精品国产一区二区三区久久久 | 91精品国产综合久久香蕉的特点 | 成人午夜激情av| 国产精品青草久久| 97在线视频人妻无码| 久久精品电影网站| 日韩激情欧美| 男的插女的下面视频| 成人av午夜电影| 精品人妻无码一区二区性色| 在线成人免费网站| 亚洲影视资源| 精品人妻人人做人人爽| 99麻豆久久久国产精品免费| 中文在线第一页| 中文字幕在线精品| 精品国产第一国产综合精品| 无码人妻精品一区二区蜜桃网站| 国产99久久久国产精品潘金网站| 欧美三级韩国三级日本三斤在线观看 | 要久久电视剧全集免费| 成人性生生活性生交12| 亚洲人成网站在线| 人妻中文字幕一区| 国产精品成人一区二区| 国产精品国内免费一区二区三区| 欧美熟妇另类久久久久久多毛| 亚洲成人www| 国产二区在线播放| 97人人模人人爽视频一区二区| 国产婷婷精品| 成人一级黄色大片| 精品国产伦理网| 78精品国产综合久久香蕉| 日本一区二区三区四区五区六区| 成人久久18免费网站麻豆| 91黑人精品一区二区三区| 欧美大成色www永久网站婷| 日韩中出av| 红桃视频一区二区三区免费| 欧美日韩一区二区在线| 麻豆电影在线播放| 精品欧美一区二区精品久久| 男人操女人的视频在线观看欧美| 国产性生活网站| 色悠悠久久久久| 日韩精品免费一区二区三区竹菊| 日韩精品视频一二三| 精品动漫一区二区三区| 中文字幕伦理免费在线视频 | 大片免费播放在线视频| 波多野结衣一区二区三区在线观看| 水野朝阳av一区二区三区|