0

例えば

let When true d = d
let foo = () |> When false

エラーなので、好きではない副作用があります。MatchFailureException

私はここで良い副作用があることを知っています:let foo = if false then ()

しかし、警告Incomplete pattern matches on this expression.は、必要なものを追加できるように教えてくれます。方法がわからない、または可能かどうかはわかりませんか?他の方法で、値を引数として使用できるのはなぜですか?

ところで:私は書くことができることを知っていますWhen b d = if b then d else ()が、質問はより一般的です。

Haskellに説明を追加

    let wh :: Bool -> IO () -> IO ()
        wh True f = f
        wh False f = return ()
4

2 に答える 2

4

次のようなものを書くと:

let When true d = d

true2 つの引数を取る関数を作成するように F# に指示し、2 つの引数をそれぞれパターンおよび と照合していますd。入力が値でない場合、trueパターンは不完全で失敗しtrueます。dパターンは変数バインディングであり、常に成功します。

関数宣言の引数で不完全なパターンを使用できるという事実は特に有用ではありません (ただし、コンパイラが検証できないより複雑なパターンを使用できると思います)。

不完全なパターンは、実際には を使用している場合、matchまたは を使用している場合にのみ意味がありますfunction。このfunctionキーワードは、他の言語のガードのようなものを提供しますが、単一の引数を取る関数でのみ機能します。タプルを受け入れるように変更する場合はWhen、次のように記述できます。

let When = function
  | true, f -> f()
  | false, _ -> ()

または、Vesa.AJK からの回答のように、引数の順序を逆にする (そしてカリー化を使用する) こともできます。

于 2014-09-23T12:14:56.913 に答える
2

これが許可されているという事実は仕様の癖であり、実際には次のようなことができるようになっています

let (a,b) = 1,2

あなたの質問は特に明確ではありませんが、次のようなものを探していると思います

let 1 |2 = 1

基本的に、最初の構文が必要ないことを除いて、構文は after match と同じです。|

補足として、これにより、私がしばらくの間書いた F# コードの最もクレイジーな部分が可能になります。

let 1 = 2

これは (警告付きで) コンパイルされますが、実行時に失敗します。

于 2014-09-23T11:44:36.750 に答える