私はそれが2つの文字列を受け取り、整数のオプションを返す関数であると考えています。なぜこのf#コードはコンパイルされませんか?
let helper (f : string -> string -> bool * int) = f >> function
| (true, item) -> Some item
| (false, _) -> None
私はそれが2つの文字列を受け取り、整数のオプションを返す関数であると考えています。なぜこのf#コードはコンパイルされませんか?
let helper (f : string -> string -> bool * int) = f >> function
| (true, item) -> Some item
| (false, _) -> None
f
は2つのパラメータを受け入れます。 >>
は、1つのパラメータだけをカレーします。あなたはそれを書き込むことによって、このようにコンパイルするために取得することができます。
let helper (f : string -> string -> bool * int) =
fun a -> f a >> function
| (true, item) -> Some item
| (false, _) -> None
それとも、このような関数のシグネチャ自体でその最初のパラメータを含めることができます:
let helper (f : string -> string -> bool * int) a = f a >> function
| (true, item) -> Some item
| (false, _) -> None
これはによって説明することは簡単ですコードを拡張して関数の受け渡し/合成が少なくなっています。
のは、コンオペレータ>>
を削除して、明示的なaString
パラメータを追加し、代わりにパイプ|>
を使用してみましょう:
let helper (f : string -> string -> bool * int) aString =
f aString |> function
| (true, item) -> Some item
| (false, _) -> None
今度は、明示的なパラメータx
でfun
の代わりfunction
を使用してみましょう:
let helper (f : string -> string -> bool * int) aString =
f aString
|> fun x ->
match x with
| (true, item) -> Some item
| (false, _) -> None
今度は、fun
をインライン展開してパイプを完全に削除しましょう:
let helper (f : string -> string -> bool * int) aString =
match (f aString : string -> bool * int) with
| (true, item) -> Some item
| (false, _) -> None
このコードは、あなたが使い始めたものと同等です。 f aString
は、1つの文字列だけが適用されたf
関数です。カレー化のために、この式のタイプはstring -> bool * int
です。これを証明するために上記のコードで型注釈を追加しました。 bool * int
の結果を生成する前に、別の文字列を指定する必要があります。
説明をありがとう! しかし、なぜ同等であることを、次のコードを選択し、コンパイラはありません: '聞かせヘルパー(F:文字列 - >列 - > BOOL * int型)aStringのbString = aStringのbString F |>機能 | (true、item) - >いくつかの項目 | (false、_) - > None' – user540570
これは同等ではないからです! :)それは同じこととしてそれらを扱う言語の構文規則に従いません。 '>'は、静的型システムで渡す引数の数を動的に調整することはできません。同じ構造を保持するには、演算子 'let(>> +)f g a b = f a b |> g'を定義し、代わりにそれを使うことができます。ただし、不必要に混乱させるので、しないでください。 は '(みましょう>> +)fgxy = FXY |>グラム せヘルパー(F: – TheQuickBrownFox
)最終的にそれを手に入れた>>演算子は単一の引数 で定義されているこれは、私はそれが動作するように期待していた方法は、次のとおりです。文字列 - >文字列 - > bool * int)= f >> +関数 | (true、item) - >いくつかの項目 | (false、_) - > None' ありがとう! – user540570
どのようなエラーが発生しますか? –
(真、アイテム) は "この表現はタイプ を持っていることが予想された 'という文字列 - > BOOL * int型 が、ここで '' * 'b' が を を入力しています"。 コンパイラは、結果の関数が1つの引数を取ると仮定しました。なぜこの決定が下されたのかを理解したいと思います。 – user540570