我需要解决这个问题。编写一个函数(键入'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”? 有什么好主意吗?
答案 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 ->