我想返回列表的第二个元素。并且此输入列表可以是任何类型。但是我不明白为什么我的代码不起作用。
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])
答案 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#,这是一个很好的工作问题。