15

私はC#のバックグラウンドからF#に来ています。これまでのところ、私は簡単なプログラムを作成し、F#インタラクティブで多くの時間を費やしました。

2つの.fsファイルを使用してVSF#プロジェクトを作成するのに行き詰まっています。

サンプルコード:

// part 1: functions
let rec gcd (a : uint64) (b : uint64) =
    if b = 0UL then a
    else gcd b (a % b)

// part 2: main()
let a, b = (13UL, 15UL)
do printfn "gcd of %d %d = %d" a b (gcd a b)

2つの.fsファイル、つまりAlg.fsとProgram.fsが必要です。これにより、Program.fsには、作業中のコードが含まれ、Alg.fsにはアルゴリズムが含まれます。

実行した手順:
2つのファイルを作成しました。コンパイラがエラーを出しました:Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'

挿入module Programしましmodule Algた。コンパイルされたプログラムは、Program.fsを完全に無視してAlg.fsからのコードのみを実行します。

Visual Studio 2010でF#2.0を使用して
います。PSグーグルでいくつかの投稿を確認し、モジュールに関するドキュメントを読んで、質問する前に相対的な質問を確認しました。

4

2 に答える 2

24

これは、プロジェクト内のファイルの順序の問題のように聞こえます。最後のファイルはエントリポイント(「メインメソッド」)であり、Alg.fsが最後であり、Program.fsが最後である必要があるように聞こえます。VSソリューションエクスプローラーの右クリックコンテキストメニューを使用して、それらを並べ替えることができます。

于 2012-04-16T20:38:59.063 に答える
7

ここで確認する必要がある少なくとも3つの個別の事項があります。

  1. @Brianが述べたように、ソース管理ファイルの順序はコンパイルの順序でもあります。これは、型推論が頻繁に使用されるF#で重要です。Visual StudioファイルリストのAlg.fs前にあることを確認してください(これを試してください:一番下になるまで選択して押してください)。Program.fsProgram.fsAlt+Down Arrow

  2. Alg.fsとは現在モジュール内にあるため、実際にモジュールをProgram.fs開いてそのバインディング()にアクセスするか、に属性を追加する必要があります。AlgProgramopen Alg[<AutoOpen>]Alg

  3. @Danielが言うように、最後の問題はプログラムへのエントリポイントの定義である可能性があります。最後のファイルの最後の関数でもあるトップレベルの[<EntryPoint>]バインディングの属性が必要です。あるいは、これはとにかく最後のファイルの最後のバインディングにデフォルト設定されます。正しい署名があることを確認してください(ダニエルのリンクを参照)。

于 2012-04-16T20:57:02.467 に答える