2017-09-27 22 views
3

私はそれが2つの文字列を受け取り、整数のオプションを返す関数であると考えています。なぜこのf#コードはコンパイルされませんか?

let helper (f : string -> string -> bool * int) = f >> function 
    | (true, item) -> Some item 
    | (false, _) -> None 
+1

どのようなエラーが発生しますか? –

+0

(真、アイテム) は "この表現はタイプ を持っていることが予想された 'という文字列 - > BOOL * int型 が、ここで '' * 'b' が を を入力しています"。 コンパイラは、結果の関数が1つの引数を取ると仮定しました。なぜこの決定が下されたのかを理解したいと思います。 – user540570

答えて

1

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 
3

これはによって説明することは簡単ですコードを拡張して関数の受け渡し/合成が少なくなっています。

のは、コンオペレータ>>を削除して、明示的なaStringパラメータを追加し、代わりにパイプ|>を使用してみましょう:

let helper (f : string -> string -> bool * int) aString = 
    f aString |> function 
    | (true, item) -> Some item 
    | (false, _) -> None 

今度は、明示的なパラメータxfunの代わり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の結果を生成する前に、別の文字列を指定する必要があります。

+0

説明をありがとう! しかし、なぜ同等であることを、次のコードを選択し、コンパイラはありません: '聞かせヘルパー(F:文字列 - >列 - > BOOL * int型)aStringのbString = aStringのbString F |>機能 | (true、item) - >いくつかの項目 | (false、_) - > None' – user540570

+1

これは同等ではないからです! :)それは同じこととしてそれらを扱う言語の構文規則に従いません。 '>'は、静的型システムで渡す引数の数を動的に調整することはできません。同じ構造を保持するには、演算子 'let(>> +)f g a b = f a b |> g'を定義し、代わりにそれを使うことができます。ただし、不必要に混乱させるので、しないでください。 は '(みましょう>> +)fgxy = FXY |>グラム せヘルパー(F: – TheQuickBrownFox

+0

)最終的にそれを手に入れた>>演算子は単一の引数 で定義されているこれは、私はそれが動作するように期待していた方法は、次のとおりです。文字列 - >文字列 - > bool * int)= f >> +関数 | (true、item) - >いくつかの項目 | (false、_) - > None' ありがとう! – user540570

関連する問題