7

F# をいじってみると、次の動作に混乱しています。List.reduce (>>)コメントアウトするとエラーになる

defaultLabel |> showRainbow
----------------^^^^^^^^^^^
This expression was expected to have type
    CoolLabel -> 'a    
but here has type
    (CoolLabel -> CoolLabel) list

この例では、 http://fsharpforfunandprofit.com/posts/conciseness-functions-as-building-blocks/から煮詰めました:

// create an underlying type
type CoolLabel = {
    label : string; 
}    

let defaultLabel = 
    {label="";}

let setLabel msg label = 
   {label with CoolLabel.label = msg}

let rainbow =
    ["red";"orange";"yellow";"green";"blue";"indigo";"violet"]

let showRainbow = 
    rainbow
    |> List.map setLabel 
    |> List.reduce (>>)

// test the showRainbow function
defaultLabel |> showRainbow

が削除された場合List.reduce (>>)、showRainbow は CoolLabel のリストを返す必要があり、コンパイラはすべてにおいて優れていると思います。

編集 -> (以下の回答で私の理解が変わったので、この文は無視してください。): 「余談ですが、List.reduce (>>) はリストから最後の CoolLabel を返すことがわかりました。」

ありがとう。

4

1 に答える 1

13

with の行を削除すると andList.reduce (>>)の型が変更されるshowRainbowため、関数ではないものを取得するため、パイプライン演算子はそれをdefaultLabel引数として呼び出すことができません。

元のプログラムでは、 の型は、あるものを別のものに変換showRainbowする関数です。CoolLabel

val showRainbow : (CoolLabel -> CoolLabel)

行を削除すると、関数のリストが得られます。

val showRainbow : (CoolLabel -> CoolLabel) list 

この例では、単純な方法で関数を使用していないので、実際に何が起こっているのかを少し説明しましょう。色rainbowのリストです。次に、rainbow |> List.map setLabelのリストを関数のリストに変換します。これは次のように読むことができます。

rainbow |> List.map (fun color -> setLabel color)

ただし、2 つの引数setLabelを取ります。ここでは最初の 1 つだけを指定するため、結果は、その色を期待してその色を虹の現在の色に変更する関数になります。CoolLabel

関数のリストを取得したら、List.reduce (>>)それらを構成します。受信した入力でそれらすべてを呼び出す新しい関数を作成します。したがって、結果は基本的に関数です。

let resultingFunction input = 
  setLabel "violet" (setLabel "indigo" (setLabel "blue" ( ... (input)))))

これで、なぜ紫のラベルが返されるのかがわかります。色がdefaultLabel赤、オレンジ、黄色などに変化し、最後に藍色、紫に変わります。

setLabel元の色を無視せずに (文字列を追加して) 組み合わせるように変更すると、setLabel関数がすべての色でどのように呼び出されたかがわかります。

let setLabel msg label = 
  { label with CoolLabel.label = label.label + " " + msg }

結果は次のようになります。

> defaultLabel |> showRainbow;;
val it : CoolLabel = {label = " red orange yellow green blue indigo violet";}
于 2013-09-01T01:14:35.293 に答える