2011-02-06 22 views
5

Estoy bastante nuevo en Haskell, pero si haces una sentencia if:Haskell IF

function a b c 
    | (a+b == 0) = True 
    | --etc. 
    | otherwise = False 

es la segunda sentencia if lo mismo que una persona si en otros idiomas, o es sólo otro si . Supongo que es lo primero ya que solo puedes tener una salida, pero solo quiero asegurarme.

+0

Sí, su línea de razonamiento iba por buen camino. ¿Qué significaría tener más de un lado derecho "ejecutado"? No hay efectos secundarios, entonces todo lo que "hacemos" debemos regresar. ¿Qué valor le devolveríamos? O tendríamos que tener una forma de combinarlos ... ¿de qué manera lo usaríamos? (Solo algunas preguntas para guiarlo a la filosofía de Haskell) – luqui

Respuesta

9

La construcción que utilizó se llama guard. Haskell comprueba las alternativas dadas una tras otra hasta que una condición rinda True. Luego evalúa el lado derecho de esa ecuación.

Se podría escribir bastante bien

function n 
    | n == 1 = ... 
    | n == 2 = ... 
    | n >= 3 = ... 

así los tipos de guardia representa un if/elseif construir a partir de otros idiomas. Como otherwise se define simplemente como True, el último

| otherwise = 

siempre será cierto y por lo tanto representa un cajón de sastre else cláusula.

Sin embargo, Haskell tiene una declaración a = if foo then 23 else 42 habitual.

+0

Tiene sentido, lo aceptaré cuando SO me lo permita. ¡Gracias! – switz

+2

Tenga en cuenta que en Haskell, la parte 'else' de las declaraciones' if' es obligatoria. Ver [Haskell 2010: Conditionals] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-320003.6).Y luego está ["cuando" y "a menos"] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:when) –

1

Debe ser como un otro si.

El patrón inferior otherwise es realmente sólo True, por lo que si el primer partido no ganó, siempre se obtendría el valor más específico y el valor de otra manera.

2

Lo que tienes aquí no es realmente una declaración if, sino más bien un guardia. Pero tiene razón en que el segundo caso se "ejecuta" solo si los casos anteriores (por casos aquí me refiero a las expresiones entre | y =) no coinciden (evaluar a True). otherwise es simplemente un sinónimo de True (de esa manera siempre "coincide").

1

Correcto. Aunque has usado guardias, la forma en que lo has expresado es más o menos idéntica a usar una instrucción if. El flujo de probar el condicional para obtener un resultado recaerá en el guardia que haya escrito en el orden en que se incluyeron en su guardia.

(a+b == 0) 

será controlada primera

etc. 

será controlada segundo y así sucesivamente, siempre que no condicional anterior es cierto.

otherwise 

Se comprobará el último, siempre que ningún condicional anterior sea verdadero.

Cuestiones relacionadas