【问题标题】:Invalid record, sequence or computation expression无效的记录、序列或计算表达式
【发布时间】:2015-02-27 13:00:38
【问题描述】:

我有一个遍历记录类型列表的函数:

let resAddr (ranges: IpRanges list) =
    ranges
    |> List.iter (fun e ->
                 {
                    let {ipStart=ipStart;ipEnd=ipEnd;subnet=subnet;gateway=gateway} = e
                    printfn "%O" ipStart
                 })

编译器报错

Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq { ... }'

我做错了什么?

【问题讨论】:

  • 不要将函数体放在花括号中fun e -> 之后
  • 函数体有几行,那我应该怎么解决呢?
  • 只需使用几行,如下面的答案

标签: f#


【解决方案1】:

不要将函数体放在大括号中,F# 不对块使用大括号,它使用空格。因此,请确保正确识别您的函数。

let resAddr (ranges: IpRanges list) =
    ranges
    |> List.iter (fun e ->
                      let { ipStart=ipStart; ipEnd=ipEnd; subnet=subnet; gateway=gateway } = e
                      printfn "%O" ipStart
                 )

另外,我发现当我的函数超过一行时,我通常更喜欢像这样单独声明它们以提高可读性

let resAddr (ranges: IpRanges list) =
    let internalHandleRange range =
        let { ipStart=ipStart; ipEnd=ipEnd; subnet=subnet; gateway=gateway } = range
        printfn "%O" ipStart
    ranges
    |> List.iter internalHandleRange

【讨论】:

  • 根据编译器规则,没有必要以 let-bindings 所需的方式缩进 lambda。 fun (...) ->后面的缩进规则比较特殊;这些行可以进一步向左缩进,甚至在fun 关键字的左侧。虽然缩进必须是一致的。就个人而言,在这种情况下,我会将 |> 缩进四个空格,右括号在同一级别或最后一行,但这只是个人喜好。我不知道如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 2014-04-22
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2017-05-13
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多