我有以下代码:
type Client =
{ Name : string; Income : int ; YearsInJob : int
UsesCreditCard : bool; CriminalRecord : bool }
type QueryInfo =
{ Title : string
Check : Client -> bool
Positive : Decision
Negative : Decision }
and Decision =
| Result of string
| Querys of QueryInfo
let tree =
Querys {Title = "More than €40k"
Check = (fun cl -> cl.Income > 40000)
Positive = moreThan40
Negative = lessThan40}
但在最后一行:
Querys {Title = "More than €40k"
Check = (fun cl -> cl.Income > 40000)
Positive = moreThan40
Negative = lessThan40}
我有一个erorr:
No assignment has given for field 'Check' of type 'Script.QueryInfo'
答案 0 :(得分:6)
F#是对空格敏感的,这意味着使用空格来表示范围。给定的代码不会编译,因为Check
显示在左侧太远。
另一方面,这应该编译(如果正确定义了moreThan40
和lessThan40
):
let tree =
Querys {Title = "More than €40k"
Check = (fun cl -> cl.Income > 40000)
Positive = moreThan40
Negative = lessThan40}
这里的花括号并不表示范围,而是表示记录的开头和结尾。由于OP中的缩进不正确,编译器将Check
绑定视为在记录表达式的范围之外。这就是它抱怨没有值绑定到字段Check
的原因。
在你习惯重要的空白区域之前,它可能有点烦人,但它确实可以避免大量显式打开和关闭范围(例如使用大括号),所以在我看来,一旦你习惯它就会受益。