fsharp中列表定义的差异

时间:2012-02-28 10:41:00

标签: list syntax f# initialization

这没关系

let staticParams = [ProvidedStaticParameter("filename", typeof<string>)
                    ProvidedStaticParameter("forcestring", typeof<bool>, false)]

但这不是

let filename3 = ProvidedStaticParameter("filename", typeof<string>)
let forcestring = ProvidedStaticParameter("forcestring", typeof<bool>, false)

let staticParams = [filename3 
                   forcestring]

有什么区别? 然后,如果我输入此内容,则会正确识别aggain

let filename3 = ProvidedStaticParameter("filename", typeof<string>)
let forcestring = ProvidedStaticParameter("forcestring", typeof<bool>, false)

let staticParams = [filename3 ;
                   forcestring]

2 个答案:

答案 0 :(得分:2)

;是一种古老的语法(来自ML)。除非您在同一行中键入多个元素(例如[ 1; 2 ]),否则没有理由使用它。同样在记录中,您不必在字段之间放置;

第二个代码无法编译,因为所有元素必须具有相同的缩进级别:

let staticParams = [filename3 
                    forcestring]

答案 1 :(得分:2)

在F#中,缩进很重要。例如:

let staticParams = [filename3
                    forcestring]

两个值具有相同的缩进级别,它们被解析为列表元素。

但是在以下情况中:

let staticParams = [filename3 
                   forcestring]
//                 ^
//                 Notice different indentation here.

将两个值解析为filename3forcestring的函数应用程序,因此出现错误消息。

由于;是列表分隔符,因此在上一个示例中,F#parser期望下一行中的另一个列表元素。因此,那里的错误缩进没有问题。