4

似乎我一遍又一遍地使用我想抽象为函数的模式。模式背后的想法是,也许我有一些东西,如果没有,我可以尝试生产它。这是我有兴趣命名的函数的一些 OCaml 代码,但问题不是 OCaml 特定的。我寻找了 Haskell 的先例,但我没有在 Data.Maybe 模块中看到这样的功能,而 hoogle 没有帮助:http ://www.haskell.org/hoogle/?hoogle=Maybe+b+-%3E+% 28a+-%3E+也许+b%29+-%3E+a+-%3E+也许+b

let my_function a f arg = match a with
  | None -> f arg
  | Some _ -> a

这几乎就像有一个默认的潜在值,但如果我们已经有一个值,它就不需要生成默认值。

编辑:

我需要这种类型的原因是我要解决一个组合问题和一组启发式方法来解决它(比如 h1 和 h2)。h1 比 h2 快。但是,这些启发式方法都不能保证找到解决方案。所以我把它们串起来并按顺序尝试。就像是

match my_function (h1 problem) h2 problem with
| None -> "bad luck"
| Some solution -> "hurray"
4

4 回答 4

10

听起来像Alternative模式:

a <|> f arg

于 2013-09-27T08:37:25.010 回答
3

怎么样:

fromMaybe (f arg) a

见:http ://www.haskell.org/hoogle/?hoogle=fromMaybe

此外,在 Haskell 中,只有在 Haskell 懒惰时f arg才有机会被计算,这与 OCaml 不同。aNothing

于 2013-09-27T08:15:40.020 回答
3

在 Haskell 表示法中,您的功能本质上是

func :: Maybe a -> (b -> Maybe a) -> b -> Maybe a
func a f arg = case a of
  Nothing -> f arg
  Just _  -> a

请注意,您只在组合中使用了输入f和,因此您可以简化为argf arg

helper :: Maybe a -> Maybe a -> Maybe a
helper a b = case a of
  Nothing -> b
  _       -> a

func a f arg = helper a (f arg)

也就是说,如果您的助手a有值,则生成,否则生成b. 但是你可以用maybefrom来写Data.Maybe

helper :: Maybe a -> Maybe a -> Maybe a
helper a b = maybe b id a

func a f arg = helper a (f arg)

然后如果你愿意,你可以内联 helper 的定义

func a f arg = maybe (f arg) id a

所以我不认为你有一个已经存在的模式,但它是maybe函数的一个简单变体,它已经存在。

于 2013-09-27T08:22:19.550 回答
1

查看您编辑中描述的一般问题,也许您会对(使用 OCaml 核心库)之类的东西感兴趣:

let heuristics = [lazy(h0 "problem"); lazy(h1 "problem"); lazy(h2 "problem")];;
let result = List.find heuristics (fun z -> Option.is_some (Lazy.force z));;

只需预先创建一个启发式列表,然后找到第一个生成有效解决方案的列表。

于 2013-09-27T16:43:27.593 回答