6

我如何在 F# 中执行此操作:

f acc (x:y:z:xs) = f (acc-x+y*z) xs
f acc [] = acc

那里的算法是任意的,重要的一点是选择列表的前 3 个和尾部,因为我需要使用所有它们和尾部。

我是否必须在 F# 中使用重复的头部调用以弹出 xy 和 z 来强制编写它?

编辑:请评论这种技术在haskell中的正式名称,我会将它放在问题标题中以供其他人未来搜索,我不记得了。

4

2 回答 2

15

当模式匹配失败时你想做什么?你可能想要这个:

let rec f acc = function
  | x::y::z::xs -> f (acc-x+y*z) xs
  | _ -> acc
于 2012-07-26T20:54:25.773 回答
2

像这样?

let rec f acc (x::y::z::xs) = f(acc - x + y * z) xs

但请注意,此函数将始终以 MatchFailureException 结束,因为它会尝试急切地评估 f 直到它到达小于 3 个元素的尾部

于 2012-07-26T20:52:46.743 回答