gpt4 book ai didi

clojure 就像 F# 中的 cond

转载 作者:行者123 更新时间:2023-12-04 10:06:57 25 4
gpt4 key购买 nike

我最近从 F# 中绕过 clojure,遇到了一个名为 cond 的宏。
以下是用法示例:

(cond
(= target (nth arr mid)) mid
(< target (nth arr mid)) (search left (- mid 1))
(> target (nth arr mid)) (search (+ mid 1) right)
(= left right) -1)

这意味着以下伪代码:
if target == arr.[mid] then return mid
if target < arr.[mid] then return (call search(left, mid-1))
if target > arr.[mid] then return (call search(mid+1, right))
if left == right then return -1

这只是二进制搜索的一个例子,以防您想知道左右和中间是什么,但并不重要。

我试图在 F# 中找到类似的东西,但我找不到,所以我决定尝试为自己编写它。
我最终得到了这样的结果:
type condition = bool * int

let cond (conds: condition seq) =
conds |> Seq.pick(fun c -> if fst c then Some (snd c) else None)

cond [| ( (=) target arr.[mid], mid )
( (=) left right, -1 )
( (<) target arr.[mid], recSrch left (mid-1) )
( (>) target arr.[mid], recSrch (mid+1) right )
|]

这里的问题是我想在递归函数中使用它,并且因为 recSrch left (mid-1) 正在被立即评估,所以我最终陷入了无限循环。我希望仅在条件成立时对其进行评估。另外,表单仍然不像在 Clojure 中那样干净。

任何想法我该如何改进?

最佳答案

这是使用 match 的草图我认为这与 clojure 非常接近。

它定义了 Cond作为将测试函数作为参数的部分事件模式

let (|Cond|_|) f  arg = 
if f arg then Some () else None;;

使用它很容易
match 1 with
|Cond ( (=) 5) _ -> printfn "unlikely"
| _ -> printfn "likely";;

关于clojure 就像 F# 中的 cond,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37508285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com