2

これはおそらく単純なものですが、単純なサンプル関数を含む .fs ファイルがあります。

let printHello = printfn "%A" "Hello"

を使用して.fsファイルへの検索パスを設定しました

>#I "PathToMyFSFile"

を使用してファイルをロードしました

>#load "Test.fs"

これはうまくいきました。ここで、実際に hello を画面に出力する関数を呼び出したいのですが、それは難しすぎることがわかりました

> Test.printHello;;
val it : unit = ()

Test.printHello();; を試してみました 同様に動作しません。実際に「Hello」を画面に出力するにはどうすればよいですか?

4

3 に答える 3

6

あなたの現在printHelloは実際には関数ではありません。それをあなたがする必要がある機能にするために

let printHello() = printfn "%A" "Hello"

お気をつけて()。その後、すべてが機能するはずです。

編集:

コンパイラが定義を認識したとき

let printHello = printfn "%A" "Hello"

単純なデータ項として渡します。たとえば、次のプログラムを考えてみましょう。

let printHello = printfn "%A" "Hello"
printfn "World"
printHello

これが印刷され"Hello"ます"World"printHelloユニットタイプだけなので、何もしません。比較してください

let printHello() = printfn "%A" "Hello"
printfn "World"
printHello()

ここprintHelloに関数があります。この場合、関数は明示的に呼び出されたときにのみ実行されるため、"World"thenが出力され"Hello"ます。

于 2011-11-11T09:16:00.827 に答える
5

ジョンがすでに言ったように、あなたprintHelloは関数ではありません-それはタイプの値ですunitprintfn(行ったように)必要なすべての引数を指定すると、命令型の操作が実行され、戻り値が返さunitれます(これは、として記述された単一の値のみを持つ型です())。その宣言を書くとすぐに印刷されることがわかります。

> let printHello = printfn "%A" "Hello";;
"Hello"
val printHello : unit = ()

後で使用するときはprintHello、単にこのunit値を参照します(情報は含まれていません)。

unit -> unit実行されるたびに何かを実行する(タイプの)関数にしたい場合は、Johnが投稿したサンプルを使用できます。

必要なすべてのパラメーターを指定したため、関数printfn部分的に適用されませんでした(したがって、すぐに印刷できます)。部分適用を使用したい場合は、次のようなものを使用できます。

> let printHello = printfn "%s %s" "Hello";; // Note - didn't give value for second %s
val printHello : string -> unit

NowprintHelloは、2番目のパラメーターを待機してから実行する関数です。

> printHello "World";;
Hello World
val it : unit = ()

> printHello "F#";;
Hello F#
val it : unit = ()
于 2011-11-11T10:13:55.577 に答える
1

他の回答ですでに述べたように、()に設定された「printHello」は単位であり、printfnの戻り値は()であり、コンソール印刷は副作用です。

レイジーを使用する:

let printHello = Lazy (fun () ->printfn "%A" "Hello")

デモ

> Test.printHello.Value;;
"Hello"
val it : unit = ()
> Test.printHello.Value;;
val it : unit = () //only once

Seqを使用します。

let printHello = seq { printfn "%A" "Hello"; yield ()}

デモ

> Test.printHello;;
"Hello"
val it : seq<unit> = seq [null]
> Test.printHello;;
"Hello"
val it : seq<unit> = seq [null] //many times
于 2011-11-11T11:52:34.717 に答える