list - 为什么模式与变量不匹配?

标签 list functional-programming pattern-matching ocaml

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

它查找列表的长度,如果是奇数(如 5),则将 len1、len2 设置为 2、3;如果是偶数(如 6),则将 len1、len2 设置为 2、3。

然后,对于列表中的每个成员,我匹配小于它的元素的数量。
然而,以下模式匹配总是数学 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)

最佳答案

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

# 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)]

如果 x 不等于 pat1pat2,这将引发 Not_found 异常。

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

关于list - 为什么模式与变量不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916421/

相关文章:

perl 模式一一匹配并处理

python - 如何为字典中未知数量的键创建字典列表?

python - 列表列表中内部列表的索引

list - 如何在保留顺序的同时删除列表中的重复元素?

java - Java中如何List复制Set?

haskell - 为什么一个函数不能接受单子(monad)值并返回另一个单子(monad)值?

algorithm - 当你只有一大组输入/输出对时,你如何找到函数的定义?

scala - 函数式 Scala 中的选择排序

filter - 如何在调用函数返回 Result::Err 时过滤掉迭代器的值?

haskell - Haskell 中的常量和模式匹配