2015-11-07 93 views
2

我有以下代码:没有分配给现场

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' 

回答

6

F#是空白敏感的,这意味着空白用于指示范围。给出的代码不能编译,因为Check显得太靠左了。

此,在另一方面,应该编译(如果moreThan40lessThan40正确定义):

let tree = 
     Querys {Title = "More than €40k" 
       Check = (fun cl -> cl.Income > 40000) 
       Positive = moreThan40 
       Negative = lessThan40} 

的花此处括号并不表明范围,而是记录的开始和结束。由于OP中的缩进不正确,因此编译器将绑定视为不在记录表达式的范围之内。这就是它抱怨没有价值被绑定到该领域Check的原因。

直到你习惯了重要的空白区域,它可能有点烦人,但它确实帮你省去了很多明确的开启和关闭范围(例如花括号),所以在我看来,一旦你习惯了它,这是一个好处。