F# 是比 Scala 更好的語言嗎?
鑒於微軟的強大實力,以及 C#/CLR 比 Java/JVM 更好這樣的事實,不免讓人聯想到,F# 也是比 Scala 設計更好的語言,同時擁有更好的編譯器/開發環境。
事實是否是這樣?比方說,F# 在編程語言的設計上,是否遠超 Scala?它的編譯器是否比 Scala 更加先進?他的開發環境是否比 Scala 更加好用?如果是的話,具體好在哪裡呢?
F#是OCaml的方言。我用過OCaml,沒有用過F#,但看過F#的文檔。
F#雖然也算一門現代編程語言,但語言設計遠遠不如Scala優雅。F#的標準庫和.NET標準庫互相之間格格不入,F#的基於代數數據類型(ADT)的類型系統也和.net原生的類庫風格格格不入。F#生態環境和Scala相比更是弱爆了。在工程實踐中,無論面向對象編程還是函數式編程,Scala都有大量的框架和第三方庫,更不要說Scala標準庫本身就完爆F#標準庫。
我覺得微軟當年在賣碟的鮑爾默領導下,對技術的理解有點走火入魔,設計的API臃腫不堪,死守向後兼容性不放。
所以微軟設計的語言也是這個尿性,壓根沒動腦筋思考過怎麼把函數式語言融入面向對象中,只是簡單兼容OCaml語法,再額外增加一堆不相干的功能。相比之下Martin Odersky做過Pizza、Generic Java,很多年前就已經試過怎麼在JVM中實現函數式編程,最終完成的Scala拋棄與Java的源代碼兼容性,最終平滑的把函數式編程特性和面向對象融入在一起:參見Scala的設計目標——Martin Odersky訪談(二)。Scala和F#的關係類似Lua和____(此處可填Python、JavaScript、Ruby)。Lua的語言核心極為精簡,然而其他動態語言能做到的功能,Lua都能做到。儘管Lua對於語言特性非常吝嗇,卻早在十多年前就支持了coroutine,這很具有前瞻性。
Roberto Ierusalimschy寫過一篇文章論述它是如何設計Lua的:Passing a Language through the Eye of a Needle我能理解@vczh 作為微軟員工,無法黑微軟的痛楚,但我還是覺得 @vczh 對「複雜」的理解稍顯淺薄。
我們看看Scala作者Martin Odersky寫的簡單還是複雜?我自己從頭比了比上下文無關語法的數量,Scala相當緊湊,和Haskell或OCaml相當,比Java5稍少,比C#和C++少得多。
由於F#是OCaml的超集,F#的語法比Scala複雜。F#功能並不比Scala強但語法比Scala複雜,暗示著F#中存在冗餘語法或者不一致的語法,也就是,不優雅。
謝邀,我沒用過F#,印象中這就是個OCaml + Computation Expression 。微軟的語言無論設計還是實現品質肯定有保證。
但是,作為一個天天讀論文的偽學院派,我絕對更愛Scala。學習Scala 的過程中基本上每一個特性都能對應到一個學術理論,從一開始的for 對應List Monad,Call-by-name 實現DSL,local type inference 給遞歸函數推導類型時必須加類型標註,把bind 換名為flatMap…一直到co/contra-variant 標記,甚至語法都和書上一樣的Bounded Quantification 等等。親切感之餘感受到理論發展確確實實地在影響著這個世界。再加上Martin Odersky 在PLT 屆神一般的存在(連Haskell 的impredicative 擴展都是基於他的理論),Scala 絕對是我在工程上的首選!微軟劍橋研究院的大神就這樣被樓上的某位說成毫無品味的搬運工,估計知道後都想拜訪樓上某位,好好請教了吧作為Scala和F#、Java和C#都湊巧用過的,只想說,都是各平台的優質語言,比各平台上的第一語言不知道高到哪裡去了你們有這功夫吵,還不如多寫寫代碼
F#比Scala好上手太多,真正是「讓簡單的事情足夠簡單」,優先函數式語法也會讓代碼更簡潔,類型系統也是,自動泛化讓絕大多數代碼不用寫類型批註。
F#基本上是直接照搬了OCaml,另外,以微軟的實力做出這樣一個語言,並不怎麼能體現水平。不過稍好一些的是在適當的時機把它推出來了。
但是Scala基本上是一路踩著坑過來的。所以到現在發展的渾身上下都是瓶頸。vczh說他複雜真的不是隨便說說,你去看看Scalaz就知道了(雖然更多時候體現的是智商問題。
你要真說這兩個哪個更好,我只能說Scala。不過除非你能有Atry那水平,否則也就是把它當成高級的Java語法糖(而且上手還不怎麼容易的那種。
F#對初學者的友好程度跟OCaml其實是一個級別的,不過還好有個牛逼點的IDE扛著,再加上.NET平台,還是能把他們甩幾公里。
===============你們丫,自己Java/C#都還沒學好就想這麼遠,真的以為這些東西是隨便什麼人都能搞的啊?根據知乎流行的觀點,Scala比F#更爛是因為Scala比C++更複雜,永遠都學不會。
如果否定Scala比C++更複雜的話,可以兩門都學會,然後舉例證明一下。
如果否定「永遠都學不會所以爛」,那麼這些人應該同時也不應該譴責C++複雜(逃總之我覺得Scala比C++學起來難多了。當然了,主要原因是因為,你理論基礎掌握的不紮實,Scala就總是有一些feature你搞不定,跟C++那種只要刻苦訓練就可以搞定的完全不是同一個概念。學過scala 學過F#
最大的感覺就是F#佔用資源(REPL 小程序運行的開銷)比scala省很多啊……typeprovider是神器 FSharp.Data是大殺器Fshart.Chart做個圖很快寫點測試代碼或做點小處理工具什麼的用fsi比用sbt console愉快一點(.NET的文件處理 網路訪問的API感覺比java原生的好用啊…)在win下打成IL的exe 直接給別人用 scala的話至少要有JRE吧給別人的話 當然這是在WIN下兩個語言都看 現在更喜歡點F# 不過F#待遇不如C# 哎~~
感覺最好在同一個環境下比吧……如果你只是在java平台上的 F#就是雞肋 反之也是有人說我偏題了。。那我說點語法上的。。
夾香蕉語法 比 scala的unapply實現自定義匹配要來得舒服 香蕉是可以有帶參數的模式的 忘記unapply能不能帶額外參數了……
F#沒有直接提供參數的Call by name語法 我記得是要用Expr的 scala這點方便一點
F#的quotation比scala現在的Macro要成熟一點 後者我記得還在實驗階段 且需要先編譯Macro 再編譯依賴他的文件(我自己操作一遍是這樣 有誤的話請指正)
F#的語言特性很少會有循環依賴的情況 (依賴編譯順序 順序在前的不能調用順序在後的 and關鍵字例外 但有使用限制) 有利有弊
F#和scala很像 但F#的類庫設計更函數式 比如用的是模塊+函數而不是方法 這是偏好上的區別 比如FP in scala書上用的則是模塊+函數 而不是方法
其他區別很多是CLR和JVM的區別吧 比如值類型有沒有用啊 泛型類型擦除好不好啊之類的…
忘記回答題主的問題了..
比方說,F# 在編程語言的設計上,是否遠超 Scala?它的編譯器是否比 Scala 更加先進?他的開發環境是否比 Scala 更加好用?
都是OO+FP F#類庫設計偏FP scala偏OO 我感覺差不多 看個人喜好吧...
F#編譯速度比scala快 但F#要保證文件和函數的編譯順序 類型推導F#更強一點F#用VS甩Scala幾條街 就算是fsi也比scala的REPL舒服不少(個人感覺)喜歡函數式的話,在JVM上用Scala,在.net上用F#。兩者都是FP+OO,都是各自平台的佼佼者。
一般人、企業應用平常用windows,可以考慮上手F#。在*x上的人,可以考慮Scala。----------------------Add below at Nov 3, 2016----------------------
可以看一下F#。(Haxe用Ocaml開發,而Rust最早也用OCaml開發,而F#是OCaml的微軟升級版,可以無縫調用C#以及其它.net資源(這點類似於Scala是Java的函數式升級版),鑒於.net core 可以支持Windows/Linux/Mac,所以前景不錯。)
F#可以比較有效的用精簡的語句快速的正確的完成多種任務。其泛型和函數式開發導致比Golang的開發效率高許多,執行效率估計得看場合(估計C/C++/Rust等它是比不過,其它的應該無憂)。可以很容易的導入項目到Azure/Heroku等雲環境,也可以通過F#直接處理Azure storage。
不過需要英語好一點,因為中文資料少。最好可以翻牆,資料會更多一點。
資源: F# Software Foundation 官網http://www.tryfsharp.org/ 上手Home | F# for fun and profit 非常好的關於F#的學習網站,一個叫Scott的人搞的(不是我啦)Suave.IO 一個輕量級的web框架,2.0支持http2.0WebSharper 一個重量級的web解決方案,用F#寫全部前後端,可以支持直接編譯到JSF# |&> BABEL - The compiler that emits JavaScript you can be proud of! 另外一個編譯到JS的好庫,最近比較火。Excel-DNA - Home Excell Add in by F# (Fcell更好,不過要收費)FsLab - Data science and machine learning with F# 大數據
Welcome to Akka.NET F# akkaF# Videos and Posts Channel 9 F#視頻F# Videos | Page 1 其它F#視頻https://www.youtube.com/channel/UC4fWHxNVIxMFYIoLHS4RqSA Youtube F# TV視頻Tomas Petricek 牛人Phillip Trelford"s Array 牛人書籍可以參考Beginning F# 4.0 和 Expert F# 4.0等等F#沒有camlp4, ocamllex之類的神器。。。
並沒有把,首先熱度比f#強,有spark,akka,kafka,play等,有數不清的高級語法,還有scalanative和scala.js,方便構建大型項目還適合寫腳本和dsl,除了語法過於強大造成學習成本高和編譯器慢的問題,scala相當出色了
靜態函數語言我只看過F#(沒有看過的是scala, haskell).開始寫代碼時,編譯不過--我想弄個scheme解釋器。有人說過,ocaml要編譯很難。遂放棄。函數式語言早於OO發明,然後ml演變成了ocaml,lisp演變出clos,歷史不會倒退,OO不會死。
C#比Java好?鑒於微軟的強大實力?我只想說:Hadoop、Storm、ElasticSearch、Spark。。都是出自JVM之手,JVM幾乎覆蓋了大數據、雲計算、企業開發、移動開發。。。等所有領域,和任何熱點都有銜接;CLR 覆蓋了啥?每個好的語言都會有一個「作品」,連Go這個模樣的都有Docker(我沒有黑Go),Scala有大數據領域的Spark!F#有啥?微軟又是什麼鬼?
不能說哪個比那個更強吧……
F# 有比較成熟的類型推倒(F#的設計本身就是基於很成熟的OCaml),語法也比較succinct,用好的話能比C#爽很多,Computation Expressions也能用來搞DSL;但是Scala 的 type system 比較靈活,有 higher-kinded type等等,所以對於更高級的abstraction的支持應該比F#好?
然後 CLR 哪裡有比 JVM 更好啊…… 這裡有好幾個 JVMs 嘞。
Scala, Erlang, F# Creators Discuss Functional Languages &<- 看三個大神在一起(Spark內核是由Scala語言開發的。Spark現在是大數據領域的當紅炸子雞。
所以光看語言優劣不談成熟應用沒有任何意義。
參見:Storm, Spark, Hadoop三個大數據處理工具都是JVM上的語言寫成的,這件事是否能說明什麼? - Java
推薦閱讀:
※如何看待reactive web框架Binding.scala ?
※現在有沒有公司使用 Scala 進行 Android 開發,如果有那麼使用哪些工具呢?
※到底該如何理解閉包?
※scala相對於python有何優缺點?
※為什麼這兩年函數式編程又火起來了呢?
TAG:編程語言 | Scala | Java虛擬機JVM | CLR | VisualF# |