这是我的代码:
let rec size = function
| [] -> 0
| t::q -> 1 + size q
let rec n k v lst = match lst with
| [] -> None
| t::q when (v - size q) = k -> t
| _::q -> n k v q
let () = print_int (n (3) (5) ([ 1 ; 2; 3; 4; 5 ]) )
它说的如下:
File "main.ml", line 10, characters 33-34:
Error: This expression has type int but an expression was expected of type
'a option
我不明白这意味着什么。
我正在尝试打印列表的第n个元素。我的意思是print_int
正在等待int
和k
,v
是整数。
答案 0 :(得分:1)
您的函数n
的第一个案例会返回None
,其类型为'a option
。
然后,您继续返回t
,因此编译器推断t
也必须是'a option
类型。
返回Some
时,您应该使用构造函数t
:
let rec n k v lst = match lst with
|[] -> None
|t::q when (v - size q) = k -> Some t
|_::q -> n k v q
但您无法立即将其与print_int
一起使用,您必须按以下方式解压缩option
类型:
let () = match (n (3) (5) ([ 1 ; 2; 3; 4; 5 ]) ) with
| Some v -> print_int v
| None -> ()
答案 1 :(得分:1)
您的函数import re
url="https://google.com/?q=cats"
re.search("\w+",url) # what should I include in this pattern to detect (:// and ?)
的类型为n
,因为在第一种情况下
int -> int -> 'a option list -> 'a option
您将返回 | [] -> None
类型为None
的值,并在第二种情况下
'a option
你要返回列表的一个元素。由于函数只能有一种返回类型,因此类型推断算法将列表元素的类型与选项类型统一起来,因此要求输入列表元素具有类型 |t::q when (v - size q) = k -> t
'a option
函数接受print_int
类型的值,但是您传递的是int
非int的内容。此外,如果您要删除'a option
,则以下表达式也不会输入:
print_int
因为你的let _ = n 3 5 [1;2;3;4;5]
函数接受一个选项列表,而不是一个整数列表,例如,
n