Как объясняет Тим, вы можете использовать только локальные привязки let
с неявным синтаксисом конструктора. Я определенно следовал бы этому подходу, поскольку он делает код F # более читабельным.
У вас есть какая-то конкретная причина, по которой вы также хотите использовать val
в своем коде? Вы все еще можете использовать их с неявным синтаксисом конструктора, но они должны быть изменяемыми и инициализироваться с помощью мутации:
type SQLConn(connection:string) as x =
let mutable connection = connection
// Declare field using 'val' declaration (has to be mutable)
[<DefaultValue>]
val mutable a : int
// Initialize the value imperatively in constructor
do x.a <- 10
member this.Connection
with get() = connection and set(v) = connection <- v
new() = SQLConn @"Data Source=.."
Насколько я могу сказать, val
требуется только для создания полей, которые не являются частными (что может требоваться некоторыми инструментами на основе кода, такими как ASP.NET, но в остальном не очень полезно).