如何从没有类型F#的列表中返回项目

时间:2020-09-11 17:45:24

标签: f#

我想返回列表的第二个元素。并且此输入列表可以是任何类型。但是我不明白为什么我的代码不起作用。

let test (x: int, y: list<'T>): 'T =
    match y with
    | [] -> 0
    | h :: t -> h
    
test (1, ["a"; "b"; "c"])
test (1, [1; 2; 3])

1 个答案:

答案 0 :(得分:3)

您的代码不会进行类型检查,因为您的实现会限制函数test的类型-它不是您指定的list<'T>,而是{{1} }。您可以在警告中看到这一点,即编译器在您返回list<int>的行上为您提供了提示:

警告FS0064:此构造导致代码的通用性低于类型注释所指示的通用性。类型变量'T已被约束为类型'int'。

问题在于0构造的所有分支都需要返回相同的类型。如果一个返回列表元素,而另一个返回match,则编译器推断该列表元素也必须为0类型。

如果该功能应在较短的列表上使用,则可以返回一个选项类型。如果不是,则可能引发异常。例外版本如下所示:

int

这现在运行并返回列表的第一个元素。满怀希望,这是足够的建议,可以让您继续解决问题!要返回第三个元素,您需要使用let test (x: int, y: list<'T>): 'T = match y with | [] -> failwith "Not enough elements" | h :: t -> h test (1, ["a"; "b"; "c"]) // Returns "a" test (1, [1; 2; 3]) // Returns 1 使函数递归,并使其在let rec情况下调用自身。我不会展示解决方案,因为我假设您正在学习F#,这是一个很好的工作问题。

相关问题