Exception F*在匹配体中引发异常

Exception F*在匹配体中引发异常,exception,fstar,Exception,Fstar,我试图在F*中创建一个函数来确定列表的最小元素,如果列表为空,我想抛出一个异常。我目前掌握的代码如下: module MinList exception EmptyList val min_list: list int -> Exn int let rec min_list l = match l with | [] -> raise EmptyList | single_el :: [] -> single_el | hd :: tl -> min hd

我试图在F*中创建一个函数来确定列表的最小元素,如果列表为空,我想抛出一个异常。我目前掌握的代码如下:

module MinList

exception EmptyList

val min_list: list int -> Exn int
let rec min_list l = match l with
  | [] -> raise EmptyList
  | single_el :: [] -> single_el
  | hd :: tl -> min hd (min_list tl)
但是,当我尝试验证该文件时,出现以下错误:

mcve.fst(7,10-7,15): (Error 72) Identifier not found: [raise]
1 error was reported (see above)

如何修复此错误?

出现此错误是因为
raise
不是F*中的原语,但需要从
FStar.Exn
(请参阅)导入,它公开了此函数--
raise
。只需打开此模块即可。代码中还有一个小问题,我在下面也解决了

下面是代码的版本:

module MinList

open FStar.Exn

exception EmptyList

val min_list: list int -> Exn int (requires True) (ensures (fun _ -> True))
let rec min_list l = match l with
  | [] -> raise EmptyList
  | single_el :: [] -> single_el
  | hd :: tl -> min hd (min_list tl)
注意,我还添加了
requires
assures
子句。这是因为
Exn
效果要求这些子句对其中的代码进行推理。但是,如果您的用例正好包含上述子句(即true和true),那么您可以使用方便的同义词,
Ex
(请参阅)。因此,以下代码也是有效的,其行为与上述代码完全相同

module MinList

open FStar.Exn

exception EmptyList

val min_list: list int -> Ex int
let rec min_list l = match l with
  | [] -> raise EmptyList
  | single_el :: [] -> single_el
  | hd :: tl -> min hd (min_list tl)

只是想澄清一下:在子句
(assures(fun->True))
中,定义了
fun
的位置,它需要什么值?
fun
是F*中内置的用于定义匿名函数的语法。这里,
fun->True
定义了一个匿名函数,该函数接受一个参数并忽略它(
部分),然后返回
True
)。这相当于其他语言(如OCaml)中的匿名函数。有些语言更喜欢称之为“lambda”s。