2 o più equazioni che definiscono una funzione in Haskell possono condividere lo stesso blocco where / let?
-
06-07-2019 - |
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.
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