Kri*_*ket 28 functional-programming clojure
我在教自己Clojure.
在非FP语言中,我可以很容易地编写嵌套if,如果我没有专门放置else,那么控制将只流出if块.例如:
Thing myfunc()
{
if(cond1)
{
if(cond2)
return something;
}
return somethingelse;
}
Run Code Online (Sandbox Code Playgroud)
但是,在Clojure中,没有返回语句(我知道),所以如果我写:
(defn myfunc []
(if (cond1)
(if (cond2) something))
somethingelse)
Run Code Online (Sandbox Code Playgroud)
那么"某事"就没有"回归"了.它似乎只是说,好吧,这里我们有一个值,现在让我们继续执行.显而易见的解决方案是结合条件,即:
(if (and (cond1) (cond2))
something
somethingelse)
Run Code Online (Sandbox Code Playgroud)
但是对于大的条件,这会变得笨拙/丑陋.此外,还需要额外的finagling来向cond1的"else"部分添加一个语句.这有什么优雅的解决方案吗?
Kon*_*rus 34
这是命令式和功能性方法之间的细微差别.通过命令,您可以放置return
在功能的任何位置,而功能最好的方法是拥有清晰明确的执行路径.有些人(包括我)在命令式编程中也更喜欢后一种方法,认为它更明显,易于管理,更不容易出错.
要使此功能显式:
Thing myfunc() {
if(cond1) {
if(cond2)
return something;
}
return somethingelse;
}
Run Code Online (Sandbox Code Playgroud)
你可以将它重构为:
Thing myfunc() {
if(cond1 && cond2) {
return something;
} else {
return somethingelse;
}
}
Run Code Online (Sandbox Code Playgroud)
在Clojure中,它的等价物是:
(defn myfunc []
(if (and cond1 cond2)
something
somethingelse))
Run Code Online (Sandbox Code Playgroud)
如果您需要"else",您的Java版本可能会变为:
Thing myfunc() {
if(cond1) {
if(cond2) {
return something;
} else {
return newelse;
}
} else {
return somethingelse;
}
}
Run Code Online (Sandbox Code Playgroud)
......及其Clojure等价物:
(defn myfunc []
(if cond1
(if cond2 something newelse)
somethingelse))
Run Code Online (Sandbox Code Playgroud)
nic*_*kik 15
(if (and (cond1) (cond2))
something
somethingelse)
(cond
(and (cond1) (cond2)) something
:else somethingelse)
Run Code Online (Sandbox Code Playgroud)
cond
如果你想比较同样的事情,它会这样做; 在开关盒中你可以使用condp
.
我不经常看到那种代码,但这是做到这一点的方法.
Art*_*ldt 15
命令式语言有if语句, if this then do that else do that
而且函数式语言有if表达式if this return that else return this
.这是一种不同的看待同一个想法的方式,它反映了表达问题的一种非常不同的方法.在功能语言中,即使你没有对这个值做任何事情,一切都有价值,真的是一切.
当我进行转换时,它帮助了我自己"这个函数应该返回什么结果",而不是我习惯要问的"这个函数应该做什么"这个问题.
在Clojure中没有明确的return语句,但是你的代码将"返回"on"something"因为你之后没有任何表达式,if
而在Clojure 中,最后一个表达式的结果被用作函数的返回值.
归档时间: |
|
查看次数: |
29138 次 |
最近记录: |