以下函数是否存在标准名称



似乎我正在一遍又一遍地使用一种我想抽象为函数的模式。该模式背后的想法是,也许我有一些东西,如果没有,我可以尝试生产它。这是我感兴趣的函数的一些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中使用输入farg,因此您可以简化为

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));;

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

相关内容

最新更新