TOm*_*TOm 0 f# if-statement list pattern-matching
我对 F# 完全陌生,我有一个函数可以计算两个不同点的总和,x如下y所示let vAdd (x1, y1) (x2, y2) : float * float = (x1 + x2, y1 + y2),然后我有另一个函数,它获取点列表,然后用于vAdd进行计算。let vSum [(x1, y1); (x2, y2)] = vAdd (x1, y1) (x2, y2)
现在我的问题是,如果给定的列表为空,我将如何检查并抛出一些错误?我尝试过 if ... then failwith "list is empty"但IsEmpty没有工作。我看过的另一件事是pattern matching,,但我不知道它如何与我的特定功能一起工作。F# 检查列表是否为空
任何帮助将不胜感激,并提前致谢!
最优雅的方法是使用模式匹配,它可以让您检查列表是否恰好有两个元素并提取它们的值:
let vSum list =
match list with
| [(x1, y1); (x2, y2)] -> vAdd (x1, y1) (x2, y2)
| _ -> failwith "The list did not have two elements!"
Run Code Online (Sandbox Code Playgroud)
您可以使用function关键字稍微缩短它,这是接受变量和模式匹配的函数的快捷方式:
let vSum = function
| [(x1, y1); (x2, y2)] -> vAdd (x1, y1) (x2, y2)
| _ -> failwith "The list did not have two elements!"
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你总是想传递两个东西,你不应该使用列表,而应该使用元组。您可以拥有一个元组的元组 - 这很好 - 但如果您知道它恰好是两个元素,那么使用列表就违反了“使无效状态无法表示”的规则。