ocaml在函数类型中如何使用匹配?

时间:2017-11-15 11:04:34

标签: algorithm recursion ocaml

我需要解决这个问题。编写一个函数(键入'listl = Empty | Cons of'listl *'a)列表。 我从来没有使用匹配没有列表。 将匹配用作整数是非常令人困惑的。

type 'a listl = Empty | Cons of 'a listl * 'a    

var: int -> (int -> 'a) ->'a listl

tabu 5 (fun x -> x^x) => [0;1;9;16;25]

必须出现这样的结果。

type 'a listl = Empty | Cons of 'a listl * 'a    

let rec tabu n f =
match n with
| 0 -> 
| n -> if n > 0 then f n :: (tabu (n-1) f) else Empty
;;

在匹配中,如何使用“0,n”而不是“Empty,Cons”? 有什么好主意吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您就会问如何匹配int类型的值。如果您想区分参数n是否具有值0或其他值,您可以这样做:

match n with
| 0 -> ...
| _ -> ...

其中下划线是一个匹配任何值的匿名通配符模式。 (但在此match中,它与0不匹配,因为第一个模式优先。)在这种情况下,您可以使用if来实现相同的功能:

if n=0
then ...
else ...

如果你想将n与不是常数的东西进行比较,比如说m,那么你不能只做

match n with
| m -> ...

因为它不使用m作为其原始绑定。相反,它将m视为非匿名通配符模式,并在模式后面的表达式中引入m的新绑定,其值为n。所以你必须这样做

if n=m
then ...
else ...

或使用when这样的句子:

match n with
| _ when n=m ->