簡體   English   中英

F#vs Scala-為什么我需要告訴F#事情的類型?

[英]F# vs Scala - why do I need to tell F# the type of things?

我從F#(和Scala)的冒險開始。 FunProg人們喜歡談論的主要好處之一是類型推斷。 在Scala中,我可以這樣寫:

  val x = List(1,2,3)
  x map ((x) => x+1)

並且編譯器知道x是一個列表,因此知道使用map函數的map變體。 此外,我可以在具有map運算符的任何對象上使用第二個like,而不管它是什么(列表,數組,Seq,...)

另一方面,從我看到的有關F#的所有示例中,您必須執行以下操作:

let x = [1;2;3];;
x |> List.map(fun f -> f+1);;

因此,我需要知道並定義x的類型,然后顯式使用List.map 。這對我來說意義不大,並且否定了整個“不用擔心類型”參數。

我是否缺少有關F#的信息? 有一個更好的方法嗎?

這不是類型推斷限制。 問題在於F#核心庫沒有為泛型函數提供過載機制。 實際上有一些,主要用於通用數字和其他內容,但只有少數。

如果要以這種風格編寫F#代碼,可以看看F#+ 使用該庫,完全可以編寫:

let x = [1;2;3];;
x |> map (fun f -> f+1);;

// val it : int list = [2; 3; 4]

它將為您推斷類型。

let y = Some 2
x |> map (fun f -> f+1);;

// val it : int option = Some 3

它也可以在任何具有Map靜態方法的類型上使用。

因此,如您所見,F#類型推斷也足夠聰明。 只是因為功能是按模塊組織的。

除此之外, 還有一個建議可以讓您編寫如下內容:

x |> _.map;;

要么

x |> (.map);;

但這僅適用於實例成員,因此對於List.map它現在不起作用。

盡管它並沒有從硬核FPer那里獲得很多愛,但實際上在F#中有一個流暢的庫,您可以對其進行細化,然后執行以下操作:

#if INTERACTIVE
#r @"..\packages\FSharp.Core.Fluent-4.0.1.0.0.5\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\FSharp.Core.Fluent-4.0.dll"
#endif

let x = [1;2;3]
x.map <| (+) 1 // ;-)
//val it : int list = [2; 3; 4]

當然,Linq擴展方法也可以:

open System.Linq
x.Select (fun x -> x + 1)
//val it : System.Collections.Generic.IEnumerable<int> = seq [2; 3; 4]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM