我正在努力学习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
| [],_ -> []
| _,[] -> []
我遇到的问题是编译器告诉我匹配表达式的第二条规则永远不会匹配。 我想用第二个规则表达的是,当“世界”列表的头部与测量值不同时,我们将在示例中进行如下计算。
有人能给我一个提示吗?
答案 0 :(得分: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
。