2016-05-29 5 views
5

私はF#を学んでいますが、let、funとfunctionの違いは何かを理解することはできません。例として:F、#の楽しみ、楽しみと機能の違い

let s sym = function 
| V x -> Map.containsKey x sym 
| A(f, es) -> Map.containsKey f sym && List.forall (s sym) es;; 

私はfunctionキーワードを指定せずにこれを書かれていませんでしたか?あるいは、functionの代わりにfunと書いてもいいですか?そして、なぜ私はあなたが

fun s x = 
... 

違いは本当に何の書き込みいくつかの例を見てきたときletを記述する必要がありますか?

letは、シンボルと値をバインドします

+0

あなたがまた 'V'と' A'が何であるかを教えている場合、あなたに選択肢を示すために、少し簡単になるだろう。 –

+0

"関数"はパイプライン式で独自の "一致"の一種です。例えばx |>関数| case1 - > ... | case2 - > ...いいスタイルです。 – sgtz

答えて

12

は、私はあなたが本当にMSDNを尋ねるが、一言で言えば必要がありますね。値はintまたはstringのような単純なタイプですが、関数でもあります。 FP関数では値があり、それらの型と同じ方法で扱うことができます。

funは、無名関数を導入するキーワードです.Camをよく知っていればラムダ式と考えるべきです。

これらは、あなたが見た他のすべての使用法が2つの構文砂糖と考えることができるという意味で2つの重要なものです。したがって、関数を定義するには、次のように言うことができます。

let myFunction = 
    fun firstArg secondArg -> 
     someOperation firstArg secondArg 

これは非常に明確な方法です。あなたは関数があると宣言して、それをmyFunctionシンボルにバインドします。

しかし、あなただけの無名関数の宣言をconflatingとletのシンボルにそれを結合することによって自分自身にいくつかの入力を保存することができます:

let myFunction firstArg secondArg = 
    someOperation firstArg secondArg 

functionは少しトリッキーです - あなたは匿名の単一引数の関数宣言を組み合わせましたmatch式を使用して、暗黙の引数を照合します。したがって、これらの2つは同等です:

let myFunction firstArg secondArg = 
    match secondArg with 
    | "foo" -> firstArg 
    | x -> x 

let myFunction firstArg = function 
    | "foo" -> firstArg 
    | x -> x  

もしあなたがF#をちょうど開始しているのであれば、私はそれを明確にしています。その用途は(主にマップ/フィルタなどの高次関数を簡潔にするために)使用されていますが、コードの読みやすさを一目でわかりません。

9

これらは、お互いのショートカットです。

最も基本的なものはletです。このキーワードは、ものに名前を与える:

let name = "stuff" 

より技術的に言えば、letキーワードは、識別子を定義し、値にバインド:

この後
let identifier = "value" 

、あなたの中の言葉nameidentifierを使用することができますコンパイラはそれらが何を意味するのか知るでしょう。letがなければ、名前を付ける方法はなく、名前でチャンクを参照するのではなく、すべてのものをインラインで書く必要があります。

は今、値が異なる種類があります。文字列"some string"がありますが、整数42があり、ポイント数5.3フローティング、ブールようにtrue値、および。特別な種類の値は関数です。関数も値で、ほとんどの点で文字列や数値に似ています。しかし、どのように関数を書いていますか?文字列を書くには二重引用符を使用しますが、関数はどうですか?

まあ、関数を記述するために、あなたは特別な言葉fun使用:

ここ
let squareFn = fun x -> x*x 

を、私は識別子squareFnを定義し、関数の種類の値にその識別子をバインドするletキーワードを使用していました。今では私のプログラムでsquareFnという単語を使うことができ、コンパイラは私がそれを使う度にいつも関数fun x -> x*xを意味することを知っています。

この構文を書くのは、常に便利技術的には十分ではなく、です。だから、短いようにするために、結合letは、上記の書き込みにそれ自体の上に余分な責任を取り、短い方法を提供します:

funletのためにそれを行う必要があります
let squareFn x = x*x 

ここでfunctionキーワードは、fun + matchの略語です。 functionを書くことは、fun x -> match x with、ピリオドを書くことと同じです。例えば

、以下の3つの定義は等価です:

let f = fun x -> 
    match x with 
    | 0 -> "Zero" 
    | _ -> "Not zero" 

let f x = // Using the extra convenient form of "let", as discussed above 
    match x with 
    | 0 -> "Zero" 
    | _ -> "Not zero" 

let f = function // Using "function" instead of "fun" + "match" 
    | 0 -> "Zero" 
    | _ -> "Not zero" 
関連する問題