1

我正在尝试学习 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
    | [],_ -> []
    | _,[] -> []

我遇到的问题是编译器告诉我匹配表达式的第二条规则永远不会匹配。我想用第二条规则表达的是,当“世界”列表的头部与度量不同时,我们将在示例中进行如下计算。

有人可以给我一个提示吗?

4

1 回答 1

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

于 2013-09-24T14:38:44.653 回答