【发布时间】:2014-05-18 01:25:51
【问题描述】:
我有一个关于编写高效函数式程序的正确方法的问题。假设我得到一个正整数列表,我想找到最小元素(如果为空,则为 0)。然后一个通用的函数程序会看起来像
minList s =
| [] -> undefined
| [x] -> x
| x :: t -> min x (minList t)
在惰性语言中,可以通过添加一个额外的子句来提高效率,如果找到零则终止递归 - 这样 s 只计算到第一个零
minList s =
| [] -> undefined
| [x] -> x
| x :: t -> if x==0 then 0 else min x (minList t)
但是,我是否认为这种技巧在像 OCaml 这样的严格评估语言中不起作用,它会在运行 minList 之前评估整个 s?如果是这样,在 OCaml 中优化它的正确方法是什么?
附加问题:好的,如果我理解 if 语句总是懒惰的。但是以下情况呢,例如:我在 int 列表上有一个函数,它首先检查第 i 个元素是否为零,即
f s = if s(i)==0 then 0 else g s
这里的输入序列 s 出现在 if 语句的两个子句中,但显然为了高效计算,您只想在第一种情况下评估 s(i)。在这里,OCaml 是否总是评估所有的 s,即使第一个案例成功了?
【问题讨论】:
-
绝对可以。如果布尔表达式为真,你永远不会评估 if 语句的假面——这会在任何语言中导致很多问题。
标签: haskell functional-programming ocaml