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

List 为什么模式与变量不匹配?,list,functional-programming,pattern-matching,ocaml,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 =

我正在写一个可以找到列表中值的代码,我不能使用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)

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

# 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不等于pat1或pat2,这将引发未发现异常


我认为您的Python代码缺少返回。

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

# 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不等于pat1或pat2,这将引发未发现异常


我认为您的Python代码缺少返回。

哦,这就是它的工作原理。但是,是否有任何方法可以在python:def fa:{ptn1:ans1,ptn2:ans2}[a]中实现这一点,在OCaml中最简单的方法是使用if。更接近的方法可能是使用关联列表或映射。哦,这就是它的工作原理。但是,是否有任何方法可以在python:def fa:{ptn1:ans1,ptn2:ans2}[a]中实现这一点,在OCaml中最简单的方法是使用if。更接近的近似方法可能是使用关联列表或映射。