2008-08-30 22 views
18

StackOverflowのように見えます。F#のグループがあります。F#言語 - 初心者向けのヒント

functional programming theoryとは別に、この言語をよりよく知りたいのですが、F#言語の使用を開始するためのより良い出発点を教えてください。私は、チュートリアル、ハウツーを意味しますが、まず何か作業を始めて何かをやり始め、言語を楽しむ機会を得ることです。

どうもありがとう

アンドレア

答えて

30

が、私は私のブログherehereに夫婦F#の概要の記事を書きました。クリス・スミス(MSのF#チームの男)は、「F#in 20 minutes」という記事 - part 1part 2を持っています。

F#(バージョン1.9.6.0)の最新のCTPは以前のバージョンと比較していくつかの深刻な変更点がありますので、そこにあるいくつかの例/チュートリアルは変更なしでは動作しない可能性があることに注意してください。

ここで多分私ははっきり非常に簡単な、おそらく素晴らしいではないですが、うまくいけばあなたと遊ぶために何かを与えるここにあなたに自分自身をいくつかのヒントを与えることができ、いくつかのクールなものの迅速な実行ダウンです: - !

最初の注記 - インターネット上のほとんどの例では、「軽量構文」が有効になっていると想定されます。この使用に次のコード行を達成するには: -

#light 

をこれはOCamlの互換性のために存在している特定のキーワードを挿入することもセミコロンでそれぞれの行を終了する必要がなくなります。この構文を使用すると、インデントでスコープが定義されることに注意してください。これは後の例で明らかになりますが、そのすべてが軽量構文がオンになっています。

あなたは、対話型モードを使用している場合は、例えば、二重セミコロンを持つすべての文を終了する必要があります: - 対話モードは、各行の後に「ヴァル」の結果を返すこと

> #light;; 
    > let f x y = x + y;; 

    val f : int -> int -> int 

    > f 1 2;; 
    val it : int = 3 

注意。これは、我々が作成している定義についての重要な情報を与えます。たとえば、 'val f:int - > int - > int'は、2つのintをとる関数がintを返すことを示します。実際にF#コードを定義するときにのみ、対話型で、我々は、セミコロンでラインを終端する必要があります

注意は、我々はあなたが「聞かせて」キーワードを使用して関数を定義すること:-)

の自由です。これはおそらくF#の中で最も重要なキーワードであり、あなたはそれをたくさん使うでしょう。例えば: - :空白ですることができますいずれかのパラメータを分割したりタプル」でパラメータを指定する - ここで関数を定義する2つの異なる方法がある

sumStuff 1 2 
3 
sumStuffTuple (1, 2) 
3 

注 -

let sumStuff x y = x + y 
let sumStuffTuple (x, y) = x + y 

は、私たちは、このようにこれらの関数を呼び出すことができます'(すなわち、カッコ内の値はコンマで区切られます)。違いは、「部分関数適用」を使用して、第1のアプローチを使用して必要なパラメータよりも少なく、第2のアプローチを使用しない関数を得ることができることである。 E.g.:-

let sumStuff1 = sumStuff 1 
sumStuff 2 
3 

注我々は式 'sumStuff 1' から機能を取得しています。 「ファーストクラスの関数」を持つ言語と呼ばれるデータと同じくらい簡単に関数を渡すことができれば、これはF#のような関数言語の基本的な部分です。

パターンマッチングはかなりクールですが、基本的にはステロイドのswitch文のようです(ええ、私は別のF#-ist :-)からフレーズにニックネームを入れました)。あなたは次のようなものを行うことができます - 私たちは「_」記号を使用

let someThing x = 
    match x with 
    | 0 -> "zero" 
    | 1 -> "one" 
    | 2 -> "two" 
    | x when x < 0 -> "negative = " + x.ToString() 
    | _ when x%2 = 0 -> "greater than two but even" 
    | _ -> "greater than two but odd" 

注意を我々は入力に依存しない戻ってきている表現が、何かにマッチさせたいとき。

必要に応じて我々は、場合用いたパターンマッチング、ELIF、およびelse文を省略することができる: - (下にリンクされたリストとして実装されている)

let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd" 

F#のリストは、このように操作することができる: -

let l1 = [1;2;3] 
l1.[0] 
1 

let l2 = [1 .. 10] 
List.length l2 
10 

let squares = [for i in 1..10 -> i * i] 
squares 
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100] 

let square x = x * x;; 
let squares2 = List.map square [1..10] 
squares2 
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100] 

let evenSquares = List.filter (fun x -> x % 2 = 0) squares 
evenSqares 
[4; 16; 36; 64; 100] 

List.map関数は、正方形関数を1から10までのリストに 'マップ'します。つまり、関数を各要素に適用します。 List.filterは、提供された述語関数を渡すリスト内の値だけを返すことによってリストをフィルタリングします。また、 'fun x - > f'構文に注意してください - これはF#ラムダです。

F#コンパイラ/インタプリタの「推論」タイプは定義されていません。つまり、使い方からどのようなものが得られるかということです。例:-

ここで、xが文字列である必要がある操作を実行しているため、コンパイラ/インタプリタはxが文字列であると判断します。また、戻り値の型も文字列であると判断します。

let f x y = x + y 

ここで、xとyの種類の数かもしれないが、コンパイラのデフォルトはintに - は:あいまいさがある場合

は、コンパイラは、たとえば、仮定を行います。あなたは型注釈を使用することができますタイプを定義する場合: - :括弧内の文字列、私たちは多くの場合、関数定義の別の部分にこれをしなければならない

let f (x:string) y = x + y 

はまた、我々は、xを囲むために持っていたことに注意してください。

F#で本当に便利で使い慣れた2つの演算子は、パイプ転送演算子と関数合成演算子です(それぞれ|>と>>)。

我々が定義|>ので: - あなたはF#で演算子を定義することができ

let (|>) x f = f x 

注意、これはかなりクールです:-)。

これは、あなたが最初の10にも正方形を得ることができるようになりますe.g.:-

[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0) 

、明確な方法で物事を書くことができます。

List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10]) 

私は次のように>>オペレータによって定義された:-)

機能組成が定義されていると思う、少なくともまあ、: - - :

let (>>) f g x = g(f(x)) 

すなわち、それはより明確ですあなたは操作を前方にパイプして、最初の関数のパラメータだけが未定義のままです。あなたは次の操作を行うことができますので、これは便利です: - ここにmapFilter

let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0) 

がリストに入力を受け入れて、以前のようにフィルタリングされたリストを返します。私たちはletの後に「REC」を配置することによって、再帰としての機能を定義する必要が再帰関数を書きたい場合は

let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0) 

- :それはの省略版です。以下の例。

いくつかのクールなもの: -

階乗

let rec fact x = if x <= 1 then 1 else x * fact (x-1) 

n番目のフィボナッチ数

let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2) 

FizzBu​​zz

let (/%) x y = x % y = 0 
let fb = function 
    | x when x /% 15 -> "FizzBuzz" 
    | x when x /% 3 -> "Fizz" 
    | x when x /% 5 -> "Buzz" 
    | x    -> x.ToString() 

[1..100] |> List.map (fb >> printfn "%s") 

とにかく非常にの概要は、うまくいけばちょっと役立ちます!

5

間違いなく、Don Symeの優れた本「Expert F#」を購入する必要があります。この本は非常によく書かれており、初心者と専門家の両方に適しています。その中には、紹介資料とはるかに挑戦的な資料もあります。ほぼ600ページで、それはお金のための良い値です。

私は、より機能的なC#を書くための多くの有用なテクニックと、WindowsでホストされたF#アプリケーションを書くために必要なすべての参考資料を提供してくれました。

本はプレスカンファレンスで公開され、に付随するウェブサイトを持っているされています。恐ろしく自分自身を娼婦しない http://www.expert-fsharp.com/default.aspx

5

@kronoz - よくお返事いただきありがとうございます。これは本当に良いスタート地点です。私はあなたのアドバイスに従い、記載された本を探します。あなたはVisual Studioで、現在のCTPリリースを持っている場合は

今、私は:-)

let thanksalot = "thanks a lot" 
printfn "%s" (thanksalot);; 
+0

感謝の言葉のために純粋にupvoted。やったよ! – AruniRC

1

コーディング手放すそれはあなたが正確に何を含む、あなたにTutorial.fsを与えるF#チュートリアルプロジェクトを、作成することができますそれは名前が示唆している。

このチュートリアルでは、F# examples at Microsoftという大きなコレクションも示しています。

また、CodePlexに行くF#サンプルプロジェクトがあります。

希望これは、私がでF#とC#での例ではReal World Functional Programming

を読んでいる

ミシェル

2

ができます:これまでのところ、私は授業で、それは非常に良い見つけるトマスPetricek

をF#のコンセプトをC#での実装を側面で示しています。 OOプログラマーには最適です。

1

科学者のための私の本F#の最初の章は、フリーで利用可能ですhere。我々は一連の無料のF#おもちゃプログラムhereを持っています。 F#.NETジャーナルの最初の記事はフリーで利用可能ですhere

関連する問題