13

VS.NET2010で完全にコンパイルおよび動作するこのコードを作成しました

module ConfigHandler
open System
open System.Xml
open System.Configuration

let GetConnectionString (key : string) =
  ConfigurationManager.ConnectionStrings.Item(key).ConnectionString

ただし、これをFSIに送信するためにcontrol+AおよびAlt+Enterを実行すると、エラーが発生します。

ConfigHandler.fs(2,1):エラーFS0010:定義内の構造化構造の予期しない開始。'='または他のトークンが必要です。

わかった。

だから私は私のコードをに変更します

module ConfigHandler =
  open System
  open System.Xml
  open System.Configuration

  let GetConnectionString (key : string) =
    ConfigurationManager.ConnectionStrings.Item(key).ConnectionString

これで、Control + A、Alt + Enterが成功し、FSIがうまく教えてくれます

module ConfigHandler = begin val GetConnectionString:string-> string end

ただし、VS.NET 2010でコードをコンパイルしようとすると、エラーメッセージが表示されます。

ライブラリまたは複数ファイルアプリケーションのファイルは、名前空間またはモジュール宣言で始まる必要があります。例:「namespaceSomeNamespace.SubNamespace」または「moduleSomeNamespace.SomeModule」

どうすれば両方を手に入れることができますか?VS.NETでコンパイルする機能と、モジュールをFSIに送信する機能はありますか?

4

2 に答える 2

20

ここで責任を負う2つのコードスニペットの間には、小さな、しかし重要な違いがあります。

F#には、を宣言する2つの方法がありますmodule。最初の「トップレベルモジュール」は、次のように宣言されます。

module MyModule
// ... code goes here

モジュールを宣言するもう1つの方法は、次のように「ローカルモジュール」として使用することです。

module MyModule =
    // ... code goes here

「トップレベル」宣言と「ローカル」宣言の主な違いは、ローカル宣言の後に=記号が続き、「ローカル」モジュール内のコードをインデントする必要があることです。

最初のスニペットのメッセージが表示される理由ConfigHandler.fs(2,1): error FS0010: Unexpected start of structured construct in definition. Expected '=' or other token.は、で最上位モジュールを宣言できないためですfsi

モジュール定義に記号を追加する=と、最上位モジュールからローカルモジュールに変更されました。Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'ローカルモジュールはトップレベルモジュールまたは名前空間内にネストする必要があるため、そこからエラーが発生しました。fsi名前空間(またはトップレベルモジュール)を定義することはできないため、ファイル全体をコピーして貼り付けるfsi場合は、@padで説明したようにコンパイルディレクティブを使用する必要があります。それ以外の場合は、ローカルモジュール定義(名前空間を含まない)をコピーして貼り付けるだけでfsi、期待どおりに機能するはずです。

参照: MSDNのモジュール(F#)

于 2012-08-28T13:12:09.917 に答える
10

一般的な解決策は、最初の例を維持しfsx、モジュールを参照するファイルを作成することです。

#load "ConfigHandler.fs"

複数のモジュールをロードし、実験用の配管コードを作成できるという利点があります。

ConfigHandler.fs本当にF#Interactiveに直接ロードしたい場合は、INTERACTIVEシンボルとコンパイラ指令を使用できます。

#if INTERACTIVE
#else
module ConfigHandler
#endif

これはfsiとfscの両方で機能します。

于 2012-08-28T09:30:11.130 に答える