2013-09-24 1 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에 값을 할당하고 mmeasurement 동일한 경우 다음 명시 적으로 확인할 수 있습니다.

관련 문제