f#match表达式 - "规则永远不会匹配"

Grz*_*cki 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
    | [],_ -> []
    | _,[] -> []
Run Code Online (Sandbox Code Playgroud)

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

有人能给我一个暗示吗?

Tom*_*cek 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
    | [],_ -> []
    | _,[] -> []
Run Code Online (Sandbox Code Playgroud)

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

when子句允许您将值赋给新变量m,然后显式检查是否m等于measurement.