2017-10-12 7 views
2

パラメータを持たないメソッドを宣言し、それを(F#-interactiveで)呼び出すと、期待される動作が得られます。 "test"が画面に表示されます。私は括弧なしでメソッドを宣言するとメソッド宣言でかっこを使用する場合

let somefn() = 
    printfn "test" 
> 
val somefn : unit -> unit 

> somefn();; 
test 
val it : unit =() 

はしかし、その後、私はいくつかの異なる動作を取得:

let somefn = 
    printfn "test" 
> 
test 
val somefn : unit =() 

> somefn;; 
val it : unit =() 

> somefn();; 

    somefn();; 
    ^^^^^^ 

C:\...\Local\Temp\stdin(4,1): error FS0003: This value is not a function and cannot be applied. 

それでは、私は理解していない:

  1. なぜメソッドの宣言はなしですパラメータがパラメータと異なる
  2. 括弧なしで宣言すると、メッセージが表示されます。val somefn:unit =()。 unit =()とはどういう意味ですか?私は今何を正確に宣言しましたか?どのようなエンティティはsomefnになりましたか?
  3. 今や、somefnと呼ばれるエンティティがあります。これは実行可能なコードを示しています。どのようにしてそのコードを実行できますか? somefnを構造体のメンバーとして宣言し、そこから実行できますか?
+4

:あなたがこれを行う必要はありませんでしょうが、単にポイント自宅を駆動するために、あなたも、複数のunitパラメータを追加することができます。 –

+3

ここにいくつかの情報を含むリンクがありますhttps://stackoverflow.com/questions/3554750/f-functions-vs-values –

+1

ここにはメソッドはありませんが、機能が異なることに注意してください。 – TheQuickBrownFox

答えて

7

上記のコメントはこの質問に答えますが、いくつかの詳細を追加します。

ファンクションを定義すると、各パラメータは実際は1つのケースのみのパターン一致です。たとえば、次のように書くことができます。

let somefn 0 = 1 

この関数のタイプはint -> intです。最初のパラメータはintであると推定されますが、一致していない他のintがあるため警告が生成されます。 somefn 01を返しますが、somefn 1は例外"The match cases were incomplete"をスローします。

タイプunitの値は、()です。これは事実上、関数の入力または出力の「無」値として機能します。パターンマッチは値とまったく同じように見えます(空リストの場合は[]と同じです)。そのため、()を使用して任意の関数にユニットパラメータを追加できます。あなたが任意のパラメータを取らない関数を記述すると、それが機能していない値だように、あなただけの単一unitパラメータを追加

let somefn() =() 
let somefn (x:unit) =() 
let somefn (_:unit) =() 

、したがって、あなたはそのを遅らせる:これらの機能はすべてまったく同じです実行。それだけで価値、関数ではありませんパラメータなしで

let somefn()() =() 
// unit -> unit -> unit 
関連する問題