Exception F*在匹配体中引发异常
我试图在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
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。