为什么带变量的模式不匹配?

时间:2013-02-16 23:45:04

标签: list functional-programming pattern-matching ocaml

我正在编写一个可以找到列表中位数的代码,我不能使用rec,应该使用List.fold_left / right。我写了下面的代码,应该可行。

它找到列表的长度,如果是5的奇数,那么它将len1,len2设置为2,3,如果它是偶数,如6,则将len1,len2设置为2,3。 / p>

然后对于列表中的每个成员,我匹配那些小于它的元素的数量 但是,以下模式匹配总是数学lessNum elmt到len1 - 有人可以告诉我为什么会这样吗?

let median (lst : int list) : float option =
  let len = List.length lst in
  if lst = [] then None
  else 
    let len1, len2 = (len - 1) / 2, (len + 1) / 2 in
    let lessNum a =
      List.length (List.find_all (fun n -> n < a) lst) in 
    let answer = List.fold_left (fun accm elmt -> 
      match (lessNum elmt) with 
        | len1 -> accm + elmt
        | len2 -> failwith "len2"
        | _ -> failwith "other"
) 0 lst in
    if len mod 2 = 0 
    then Some ((float_of_int answer) /. 2.0)
    else Some (float_of_int answer)

1 个答案:

答案 0 :(得分:4)

模式中出现的标识符始终匹配,并将相应的值绑定到标识符。标识符的任何当前值都无关紧要:模式会导致新绑定,即它为标识符提供 new 值(仅在匹配内)。

# let a = 3;;
val a : int = 3
# match 5 with a -> a;;
- : int = 5
# a;;
- : int = 3
#

所以,你的匹配声明没有按照你的想法行事。您可能必须在代码的这一部分使用if

<强>更新

以下是如何在后续问题中使用关联列表来近似函数f

let f x = List.assoc x [(pat1, ans1); (pat2, ans2)]

如果Not_found不等于xpat1,则会引发pat2例外。

(我认为您的Python代码缺少return。)