似乎我正在一遍又一遍地使用一种我想抽象为函数的模式。该模式背后的想法是,也许我有一些东西,如果没有,我可以尝试生产它。这是我感兴趣的函数的一些OCaml代码,但问题不是特定于OCaml的。我寻找了Haskell的先例,但我还没有在Data中看到这样的功能.也许模块和hoogle没有帮助:http://www.haskell.org/hoogle/?hoogle=Maybe+b+-%3E+%28a+-%3E+Maybe+b%29+-%3E+a+-%3E+Maybe+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"
听起来像Alternative
模式:
a <|> f arg
在Haskell符号中,你的函数本质上是
func :: Maybe a -> (b -> Maybe a) -> b -> Maybe a
func a f arg = case a of
Nothing -> f arg
Just _ -> a
请注意,您只在组合f arg
中使用输入f
和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
。但是你可以用maybe
来写Data.Maybe
helper :: Maybe a -> Maybe a -> Maybe a
helper a b = maybe b id a
func a f arg = helper a (f arg)
然后,如果您愿意,可以内联帮助程序的定义
func a f arg = maybe (f arg) id a
所以我不认为你有一个已经存在的模式,但它是maybe
函数的简单变体,已经存在。
怎么样:
fromMaybe (f arg) a
请参阅:http://www.haskell.org/hoogle/?hoogle=fromMaybe
此外,在 Haskell 中,f arg
只有在a
Nothing
时才有机会被计算,因为 Haskell 懒惰,不像 OCaml。
看看你编辑中描述的一般问题,也许你会对类似的东西感兴趣(使用 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));;
只需预先创建一个启发式列表,然后找到生成有效解决方案的第一个。