【问题标题】:Nested function containing list comprehension包含列表理解的嵌套函数
【发布时间】:2016-12-13 21:45:16
【问题描述】:

我可以有这样的功能:

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. 

我无法解决这个错误。我希望有一个来自“行”的字符串列表。

【问题讨论】:

  • 尝试缩进右大括号(或删除in并将readLines f放在下一行)。
  • 您说的非常正确,先生,非常感谢。现在的问题是,为什么。

标签: list f# syntax-error


【解决方案1】:

使您的第二个 sn-p 编译的最小更改是在右方括号之前插入两个(或一个)更多空格:

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

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2013-08-07
    相关资源
    最近更新 更多