F#格式不佳的模块

时间:2014-05-16 22:39:58

标签: module f#

您好我的代码有什么问题,我的错误是: 无与伦比的{这主要是由于我的标签, 无效的记录,序列或计算表达式。序列表达式应为“seq {...}' 表达式中此点或之前的不完整结构化构造

module records =
   let debate(irthes:DateTime) =
       {
            let mutable manch = nexttime(irthes) 
            let mutable array1: DateTime array = Array.zeroCreate 480
            for i in 0 .. 480-1 do
                Array.set array1 i (manch)
                let next = Array.get array1 i
                let! manch=nexttime(next)
           return(array1)  
       } 

2 个答案:

答案 0 :(得分:2)

我想你想要这样的东西:

module records =
  let debate(irthes:DateTime) =
    let mutable manch = nexttime(irthes) 
    let array1: DateTime array = Array.zeroCreate 480
    for i in 0 .. 480-1 do
      array1.[i] <- manch
      manch <- nexttime manch
    array1

以下是代码出错的地方:

  • 您没有使用计算表达式(如异步工作流程),因此无需用大括号括起来。

  • 要返回值,您不需要return。只需使用该值作为正文的最后一个表达式

  • let!构造并不意味着分配。它在计算表达式中具有相当特殊的含义。要改变manch,您可以写manch <- nexttime(next)

  • 不是错误,但您不需要将数组标记为可变。您正在改变其内容,而不是array1变量。

  • 通过使用arr.[i] <- v写入数组并使用arr.[i]从数组中读取,可以使代码更好。我也不明白你为什么在写完之后立即读取一个值。

答案 1 :(得分:2)

对你正在尝试做的事情甚至没有那么多。首先,您似乎正在尝试初始化记录 - 为此,您必须使用=将字段分配给值,如下所示:

type Person = { name: string; address: string }
let joe = { name = "Joe Smith"; address: "1600 Pennsylvania Avenue NW, Washington, 20500" }

此外,F#没有提前退出(return);任何函数/方法的结果只是最后一个表达式的结果:

let increment n = n + 1

因此没有return n + 1。此外,let!仅用于计算表达式。但是,如果要将变量(例如foo)变为42,请使用foo <- 42。我看到的最后一件事:return(array1)的线条缺少另一个缩进空间 - 这真的很重要!

看起来你可能会复制粘贴代码而不知道它的含义是什么 - 这些代码通常不会很好。如果是这种情况,请尝试通过自己测试来确切了解F#中的某些功能是如何工作的。从长远来看,它会变得更顺畅。