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.0

WebSharper 一個重量級的web解決方案,用F#寫全部前後端,可以支持直接編譯到JS

F# |&> 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# akka

F# 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# |