2 o più equazioni che definiscono una funzione in Haskell possono condividere lo stesso blocco where / let?

StackOverflow https://stackoverflow.com/questions/827994

Domanda

2 o più equazioni che definiscono una funzione in Haskell possono condividere lo stesso blocco Where / let?

Vorrei presentare un esempio inventato per illustrare la domanda.

Innanzitutto, considera il seguente codice come punto di partenza:

someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

Finora tutto bene. Ma poi, immagina di dover fare i conti con un & Quot; caso alternativo & Quot ;, dove devo restituire zero se v3 == 99 e differenza & Lt; 4 (completamente arbitrario, ma diciamo che quelli sono i miei requisiti).

Il mio primo pensiero sarebbe quello di fare questo:

someFunction v1 v2 99 | difference < 4 = 0
someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

Tuttavia, ciò non funzionerà perché la prima equazione per someFunction e la seconda equazione per someFunction non condividono entrambe lo stesso blocco. Questo non è un grosso problema in questo esempio inventato perché c'è solo una variabile nel blocco where (& Quot; differenza & Quot;). Ma in una situazione del mondo reale, potrebbero esserci un gran numero di variabili e sarebbe inaccettabile ripeterle.

So già come risolverlo usando le protezioni e avendo una sola equazione. La domanda è: esiste un modo per più equazioni di condividere la stessa clausola where / let? Perché sembra desiderabile avere più equazioni con schemi diversi invece di essere costretti ad avere solo un'equazione con molte guardie.

È stato utile?

Soluzione

Un'opzione sarebbe quella di elevare la funzione nel blocco stesso:

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2

Altri suggerimenti

Penso che non puoi. Probabilmente la tua migliore soluzione è qualcosa di simile:

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top