2017-04-05 1 views
2

몇 백 줄의 코드가 있습니다. F # interactive 플래그에이 오류가 표시되지 않는 이유는 무엇입니까?

let soa = 
    election 
    |> Series.observations 
printfn "%A" <| soa 

자주 두 가지 일이 :

1) 불가사의 마지막 줄에 변경 : 그것의 많은 작은 조각은 다음과 같은 구조를 가지고 있습니다

printfn "%A" <| 

위의 코드가 무엇 때문에 다음이됩니다

let soa = 
    election 
    |> Series.observations 
printfn "%A" <| 

let sls = 
    election 
    |> Series.sample (seq ["Party A"; "Party R"]) 
printfn "%A" <| sls 

이것은 내가 어디에 있는지 위에 수백 줄의 일이 생깁니다. 편집기에서 파일을 diting.

2)이 경우 F# Interactive이 발생하면 오류가 표시되지 않습니다. 오류 메시지가 생성되지 않습니다. 코드의 비트가 편집기에서 삭제 이유에

error FS0039: The value or constructor 'sls' is not defined.

모든 아이디어 : 나는 액세스 sls하려고한다면, 나는 메시지가? (이것은 매우 자주 발생합니다)

그리고 왜 F# Interactive에 오류 메시지가 나타나지 않습니까?

답변

5

두 번째 let 블록은 연산자 인 파이프가 오프셋 규칙에 예외를 제공하기 때문에 앞에 printfn에 대한 인수로 해석됩니다. 연산자의 두 번째 인수는 첫 번째 인수보다 들여 쓸 필요가 없습니다 . 그리고 두 번째 let 블록이 최상위 레벨에 있지 않고 오히려 printfn의 인수의 일부이기 때문에 그 정의는 외부에서 액세스 할 수 없게됩니다.

let f x = x+1 

// Normal application 
f 5 

// Complex expression as argument 
f (5+6) 

// Let-expression as argument 
f (let x = 5 in x + 6) 

// Replacing the `in` with a newline 
f (let x = 5 
    x + 6) 

// Replacing parentheses with pipe 
f <| 
    let x = 5 
    x + 6 

// Operators (of which the pipe is one) have an exception to the offset rule. 
// This is done to support flows like this: 
[1;2;3] |> 
List.map ((+) 1) |> 
List.toArray 

// Applying this exception to the `f` + `let` expression: 
f <| 
let x = 5 
x + 6 
:

의 몇 가지 실험을 해보자

관련 문제