Chcę sprawdzić stan poprzedniego if condition
, aby ustalić, czy następny if condition
ma zostać wykonany, czy nie. Każdy if condition
może zwracać wartość.Jak uprościć zagnieżdżanie - jeśli używasz, aby zwrócić wartość w Haskell
Edit: Przepraszam, że przykład I dostarczone przed wyglądają trochę dziwnie ... :( To jest mój prawdziwy przykład, i chcę, aby uprościć if-then-else
dla goingToMove
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
Edit: zły przykład Kiedy ta sprawa jest napisany w języku Java, mogą używać zmienny logiczną flagi i zwracają zmienne dane.
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;
}
}
Ale w Haskell, nie ma zmiennego danych i tylko stan if-then-else
. Potem wola kod wygląda tak, i chcę, aby uprościć to, ponieważ w mojej prawdziwej pracy, istnieje 8 poziomów if-then-else
które wyglądają straszne i brudny ....
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
Czy "ruch", do którego dzwonisz w kodzie Java, jest taki sam, jak definiowany "ruch"? Jeśli tak, nie widzę, w jaki sposób nie pętla nieskończenie dla niezerowych danych wejściowych. 'move (3)' wywołania 'move (3)' wywołania 'move (3)' ... – rampion
Podany kod haskell ma również niewłaściwy typ. Wyraźnie zwracasz 'null' w pewnym momencie kodu java, co oznacza, że kodiem haskell powinno być' Int -> Maybe String', nawet jeśli nie był to nieskończona pętla. Aha, a sugerowany kod haskell ma również błąd składniowy (brak linii z literą if?), Co sprawia, że trudno jest dokładnie określić, co robisz. – Carl
Podałem prawdziwy przykład :(przepraszam – code4j