错误:此表达式的类型为int,但表达式的类型为'a option

时间:2018-06-12 15:36:49

标签: functional-programming ocaml typeerror

这是我的代码:

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正在等待intkv是整数。

2 个答案:

答案 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