2016-09-03 5 views
7

F#では次の文では、これは「聞かせて」次なぜ、コンパイルできないのと同じ行に式の最初の行を置くのですか?

let listx2 = [1..10] 
    |> List.map(fun x -> x * 2) 
    |> List.iter (fun x -> printf "%d " x) 

ブロックが未完成で、次のエラーで失敗します。表現を期待する。

バインディングで予期しない中断演算子。この点または他のトークンの前またはそれ以前に、不完全な構造化された構成が必要です。

以下は

let listx2 = 
    [1..10] 
    |> List.map(fun x -> x * 2) 
    |> List.iter (fun x -> printf "%d " x) 

をコンパイルします。しかし、私はまた、これは警告

let listx2 = [1..10] |> 
    List.map(fun x -> x * 2) |> 
    List.iter (fun x -> printf "%d " x) 

可能な間違ったインデントコンパイルするが、持っていることに気づい:このトークンは、コンテキストのオフサイドであるが、位置で開始(10:18)。このトークンをさらにインデントするか、標準の書式設定規則を使用してください。

最初の2つのステートメントの違いは何ですか?

答えて

7

あなたが暗黙のうちに[と同じ文字であることを次の行のインデントレベルを設定している

let listx2 = [1..10] 

を持っている場合。仕様からのオフサイド文字のための以下の規則によって与えられる通り:

Letまたはトークンがトークンの直後に出現した直後。

だから、最初の例では、|>はので、すべての作品を、あなたがエラーを取得しますが、2番目に、彼らは同じなので、それ未満[をインデントされます。

|>を行の最後に移動すると、警告が表示されるのはなぜか分かりません。

+0

eol '|>'について:私は、インデントにかかわらず、オペレータで終わる行が暗黙的に次の行に続くと思います。 – Tarmil

関連する問題