2010-12-08 8 views
6

私はF#の学習にかなり興味があります。F#の学習中に覚えておくべきことスキームを学んだ

私は機能的な言語での私の唯一の経験は、大学でSchemeの2つの入門コースでした。

以前にSchemeを学習していたF#の学習中に覚えておく必要があることはありますか?方法論、邪魔者、または私に問題を起こすかもしれない他の事柄の違い?

答えて

3

スキームは素晴らしい機能的言語です。学校で学ぶことは、機能プログラミングのための良い基礎を提供するはずです。

F#は静的に型付けされていますが、Schemeは動的であるため、明らかな違いの1つです。他の静的言語(特にC#のような.NET言語)を経験しているなら、それは大きな問題ではありませんが、ほとんどの経験が動的であれば、それは変化になります。

主要なF#関数プログラミング関数(例:List.mapなど)の名前を知ることは重要です。ほとんどすべての関数型言語は同じ基本セットを持ちますが、異なる名前を持つことがよくあります(私は比較する主要なScheme名を思い出しません)。

サンプル入力/出力を持つ古いScheme 'プログラミング割り当て'があれば、F#で言語を「ウォームアップ」する方法としてコードを再コードすると便利です。

5

以前に学習したSchemeを使ってF#を学習する際に留意すべきことはありますか?方法論、邪魔者、または私に問題を起こすかもしれない他の事柄の違い?

静的タイピングは、SchemeとF#の主な違いです。これにより、タイプのプログラミングと呼ばれるスタイルが容易になります。タイプシステムは、コンパイラがコンパイル時にプログラムのこれらの側面を正しく示し、制約の違反が直ちに検出されるように、関数およびデータに関する制約をエンコードするために使用されます。例えば、同じタイプの1つのまたは複数の要素の配列は次のタイプの値によって搬送されるかもしれない

type list1<'a> = List1 of 'a * 'a list 

let xs = List1(1, []) 
let ys = List1(2, [3; 4]) 

コンパイラは、任意の試みは、これらの空のいずれかを使用することを保証シーケンスはエラーとしてコンパイル時に捕捉されます。私たちの新しい配列と

> List.reduce (+) [];; 
System.ArgumentException: The input list was empty. 
Parameter name: list 
    at Microsoft.FSharp.Collections.ListModule.Reduce[T](FSharpFunc`2 reduction, FSharpList`1 list) 
    at <StartupCode$FSI_0271>[email protected]() 
Stopped due to error 

:ビルトインリストの実装の例外を除いて、実行時にbarfsので、それが空のシーケンスが発生した場合

さて、reduce関数は空のシーケンスにも意味がありませんこれは素晴らしい方法です

let rec reduce f = function 
    | List1(x, []) -> x 
    | List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs))) 

:1つの以上の要素の、私たちは今、その入力が非空であることを型システムによって保証されているので、例外を除いて、実行時にbarfs決してreduce関数を書くことができます信頼性を向上させるランタイムエラーの原因を取り除くことによってソフトウェアの脆弱性を排除し、Schemeのような動的に型指定された言語でも開始することはできません。

+0

あなたの徹底的な対応に感謝します!最初のコード例について少し不明ですが、それが何をしているのかを明確にしてください。 –

+0

最初のコード例では、 'list1 'という型を定義しています。この型は、型変数' 'a'に続いて、' list1 'という型の値の後に' [1] 'と' [2; 3; 4]。 –

+0

素晴らしいです、それは私にとって完璧です。あなたの明確化のおかげで:) –

1

私はHaskellについても考えてみることをお勧めします。彼らはおおよそF#とMLと同じファミリであり、Haskellには他にはない興味深い機能概念がたくさんあります。

インタラクティブなオンラインチュートリアルについては、tryhaskell.orgをご覧ください。