2016-06-11 2 views
4

F#での 'do'キーワードの微妙な使い方の1つは、unit(別名ステートメント)を返す式に注釈を付けることです。例えば、私は関数型でこれをして、戻り値の型が単位であることを明確にし、コンパイラに型チェックを指示します。例:F#でのバインドの適切なスタイル

let restart agent = do agent.Post Restart 

しかし、「do」キーワードを支配するものがF#コミュニティにあるのは不明です。この例では「を実行」キーワードを使用する適切な方法は何

は:

// Annotate each statement 
let move source destination = 
    do copy source destination 
    do clear source 

// Annotate the statements as one block 
let move source destination = 
    do 
     copy source destination 
     clear source 

// Just annotate the "return" statement 
let move source destination = 
    copy source destination 
    do clear source 

// Perhaps don't annotate at all? 
let move source destination = 
    copy source destination 
    clear source 

答えて

3

私はめったに(unit表現を導入する)は、この目的のためにF#コードで使用doを見ません。あなたが記述している型チェックのほとんどは、未使用の値に関するFS0020の警告の形で、それなしで自動的に実行されます。

あなたは、単に3つのいずれかが起こる、その後

let move source destination = 
    copy source destination 
    clear source 

を記述する場合:この場合

  • 両方copyclearリターンunit

    すべてが順調です。

  • copyあなたは無視値についてFS0020警告されます。この場合はユニット

    以外のタイプを返します。

    、現在は無視されているintを返しcopy source destination式を。この値を必要としない場合は、ignore関数を使用して明示的に無視する必要があります。 ignore (copy source destination)などの名前に結果をバインドするか、そこに警告しないであろうが、moveclearと同じ型を持つことになり、この不一致がコールに現れるであろう。この場合unit

    以外の型を返すclearlet result = copy source destination

  • copy戻り部、 moveのサイトでは、上記と同じ警告が表示されます。

だから型チェックのために、doの有用性はかなり限られている:それは警告を行うことによって、違いを作るmoveから、それにナビゲートすることができ強制するのではなく、元の行に表示されますのみ、最後の場合には(またはmoveが範囲内の最後の行である場合 - moveの発信者のコールサイトなど)。最初の場所でエラーになることはめったにありません。clearが値(たとえば、クリアが成功したかどうかを示すブール値)を返す場合は、間違いなくを実行します。は、

これは非常に単純なトークンであり、(IMO)は読みやすさにはほとんど影響を与えません。軽文字(#light "off")を無効にし、セミコロンとendのトークンを手動で入力することを好む少数のユーザーでは、F#コミュニティに問題はないと考えて、doはどこでも眉を上げることは想像できません。

+0

偉大な答え!私はFS0020について認識していますが、特にユニット表現が副作用を意味するため、このような使い方について考え、読者の目を引くことを余儀なくされているので、この場合は明示的にすることをお勧めします。セミコロンについて言えば、別の選択肢があります。明確な情報源 – monoceres

関連する問題