2016-12-13 9 views
1

私はF#(とScala)で私の冒険を始めます。 FunProgの人々が話したい主な利点の1つは、型推論です。スカラ座では、私はこのような何か書くことができます。F#対Scala - なぜF#に物の種類を伝える必要がありますか?

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

をし、コンパイラは、xがリストであることを知っており、そのためのマップ機能のマップのバリアントを使用することを知っています。さらに、私はmap演算子を持つオブジェクト(リスト、配列、Seqなど)に関係なく、2番目のように使用できます。

一方、私が見たすべてのサンプルだから私は知っているとxの種類が何であるかを定義する必要が明示的List.map .Thatは、私にはほとんど意味がないし、全体が「ない否定を使用

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

:F#のについて、あなたのような何かをしなければなりません型の引数を心配する。

私はF#について何か不足していますか?これを行うより良い方法はありますか?

+4

'map'はscalaのメソッドであり、' List.map'はF#の 'List'モジュールの関数です。利用可能な '' map''操作があることを知るには、どちらの場合でも 'x'の型を知る必要があります。 – Lee

+0

ありがとう@Lee。私はそのマップをListのメソッドとしていますが、既知のオブジェクト(xというList型のメソッド)にメソッドを適用しているので、それを直接指定する必要があるのはなぜですか? 。 – Noam

+1

gigglesのために、私はFSIの 'open'ing Listを試してみました。 > stdin(5,6):エラーFS0892:この宣言は、 'RequireQualifiedAccess'としてマークされたモジュール 'Microsoft.FSharp.Collections.List'を開きます。代わりに、モジュールの要素への修飾された参照を使用するようにコードを調整します。 'map'ではなく 'List.map'。この変更により、新しい構文がライブラリに追加されるたびにコードが堅牢になります。 –

答えて

6

これは型推論の制限ではありません。問題は、F#core libが汎用関数に過負荷メカニズムを提供していないことです。実際には、いくつか、主に一般的な数字やその他のものがありますが、ほんのわずかです。

このスタイルで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#型の推論を見ることができるので、十分にスマートです。関数がモジュールで整理されているからです。

それ以外にthere is a proposalからあなたのようなものを書くことができるようにする:

x |> _.map;; 

または

x |> (.map);; 

しかし、それはそれとして働かないList.mapためだから、唯一、インスタンスメンバーと働くだろう今は

それはF#で流暢なライブラリが実際に存在し、ハードコアFPersから多くの愛を得ることはありませんが、あなたはそれをnugetでき
1

と、このような何かより:

#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] 
関連する問題