2013-09-24 82 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