2016-12-13 3 views
4

я могу иметь такую ​​функцию:Уплотненной функция, содержащий список понимание

let readLines (filePath:string) = [ 
    use sr = new StreamReader (filePath) 
    while not sr.EndOfStream do 
     yield sr.ReadLine() 
] 

Но я не могу иметь такую ​​функцию:

let lines (f:string) = 
    let readLines (filePath:string) = [ 
     use sr = new StreamReader (filePath) 
     while not sr.EndOfStream do 
      yield sr.ReadLine() 
    ] in readLines f 

Я получаю ошибку:

Block following this 'let' is unfinished. Expect an expression. 

Я не могу обмануть эту ошибку. Я бы ожидал список строк из «строк».

+1

Попробуйте отступов закрывающей фигурной скобки (или падение 'в' и положить' readLines f' на следующей строке). – kvb

+0

Вы очень верны, сэр, и большое спасибо за это. Вопрос в том, почему. –

ответ

4

Минимального изменение, чтобы сделать свою вторую сниппета компиляцию, чтобы вставить два (или один) больше пространства перед закрывающей квадратной скобкой:

let lines (f:string) = 
    let readLines (filePath:string) = [ 
     use sr = new StreamReader (filePath) 
     while not sr.EndOfStream do 
      yield sr.ReadLine() 
     ] in readLines f 

Причина заключается в том, что тело let связывающей потребности быть отступ чем ключевое слово let - компилятор F # использует это, чтобы определить, где заканчивается выражение тела функции. Это также то, что сообщение об ошибке пытается сказать, что «это« пусть »недоделано» почти всегда означает, что у вас нет правильного выражения внутри let.

Как упоминалось в комментарии к @kvb, более идиоматичным способом написания этого является то, что он полностью полагается на то, что компилятор F # является чувствительным к пробелам и будет определять, где находятся слова in с правильным кодом с отступом. Мое личное предпочтение также ставить [ на новую строку:

let lines (f:string) = 
    let readLines (filePath:string) = 
     [ use sr = new StreamReader (filePath) 
     while not sr.EndOfStream do 
      yield sr.ReadLine() ] 
    readLines f 
Смежные вопросы