2013-09-24 57 views
1

我想学习F#并且我已经到了一个地步,我不明白我做错了什么。我写了下面的代码:f#匹配表达式 - “规则永远不会匹配”

let p = 0.2::0.2::0.2::0.2::0.2::[] 
let world = "g"::"r"::"r"::"g"::"g"::[] 
let measurements = "r"::"g"::[] 
let pHit = 0.6 
let pMiss = 0.2 

let rec sense world probs measurement = 
    match world, probs with 
    | measurement::row, p::rop -> (p*pHit)::sense row rop measurement 
    | _::row, p::rop -> (p*pMiss)::sense row rop measurement 
    | [],_ -> [] 
    | _,[] -> [] 

我的问题是,编译器告诉我,这场比赛表现的第二个规则将永远不会被匹配。 我试图用第二条规则来表达的是,当“世界”列表的头部与测量不同时,我们将在示例中进行如下计算。

任何人都可以给我这个提示吗?

回答

8

我想你想:

let rec sense world probs measurement = 
    match world, probs with 
    | m::row, p::rop when m = measurement -> (p*pHit)::sense row rop measurement 
    | _::row, p::rop -> (p*pMiss)::sense row rop measurement 
    | [],_ -> [] 
    | _,[] -> [] 

与你原来的代码的问题是该条款measurement::row, p::rop实际上是指:给定任意两个非空列表,第一个的第一要素分配给measurement和第一个的尾部到row。这隐藏了现有变量measurement并定义了一个新变量(而不是检查输入的值是否等于现有变量)。

when子句允许您将值分配给新变量m,然后明确检查m是否等于measurement