gpt4 book ai didi

haskell - 如何在 Haskell 中简化嵌套 if 使用以返回值

转载 作者:行者123 更新时间:2023-12-04 04:47:52 24 4
gpt4 key购买 nike

我想检查之前if condition的情况确定下一个if condition是被执行还是不被执行。每个if condition可能返回一个值。

编辑:对不起,我之前提供的例子看起来有点奇怪...... :(
这是我的真实示例,我想简化 if-then-else对于 goToMove

goingToMove p routes points w h = 
if canMove p points
-- the point can be moved in the map
then let r = routes ++ [p]
l = remainList p points
in move p r l w h
-- the point cannot be moved in the maps
else []

move p routes points w h =
if (length routes) == 2
then routes
else let one = goingToMove (tallRightCorner p) routes points w h in
if (null one)
then let two = goingToMove(tallRightBCorner p) routes points w h in
if (null two)
then let three = goingToMove (tallLeftBCorner p ) routes points w h in
if (null three)
then ....
...... -- until, let eight = ..
else three
else two
else one

编辑:坏例子
当这个东西用java写的时候,我可能会使用一个可变的 bool 标志,并返回一个可变的数据。
public String move (int number){
// base case
if (number == 0){
return "Finished the recursion";
}
// general case
else {
String result;
boolean isNull = false;

if ((result = move(3)) == null){
isNull = true;
}
else {
return result;
}

// continue to execute the if-conditions if the previous condition failed
if (isNull){
if((result = move(2)) == null){
isNull = true;
}
else {
return result;
}
}

if (isNull){
if((result = move(1)) == null){
isNull = true;
}
else {
return result;
}
}

return null;
}
}

但是在 Haskell 中, 没有可变数据,只有 if-then-else健康)状况。 那么代码会是这样的,我想简化一下,因为在我的实际工作中, if-then-else 有 8 个级别看起来很糟糕而且很乱......
move 0 = "Finished the recursion"
move n =
let one = move 3 in
if null one
then let two = move 2 in
if null two
then let three = move 1 in
then null
else three
else two
else one

最佳答案

如果我想在 Java 中执行以下操作:

result = func1(arg);
if (result == null){
result = func2(arg);
if (result == null){
result = func3(arg);
if (result == null){
result = func4(arg);
}
}
}
return result;

我实际上在做的是从 func1(args) 中找到第一个结果。 , func2(args) , func3(args) , func4(args)返回非空值。

在 Haskell 中,我会建模 func1 , func2 , func3 , 和 func4作为返回 Maybe a 的函数值,以便他们可以返回 Nothing如果他们失败了。
func1, func2, func3, func4 :: Int -> Maybe Result

然后我可以使用 <|>运算符(来自 Control.Applicative ),它对 Maybe a 具有以下定义:
Nothing <|> x = x
x <|> _ = x

所以我可以将上面的Java转换为
func1 arg <|> func2 arg <|> func3 arg <|> func4 arg

并且由于惰性评估的奇迹, func2 arg仅在 func1 arg 时进行评估返回 Nothing ,与 Java 示例中的相同。

关于haskell - 如何在 Haskell 中简化嵌套 if 使用以返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736062/

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