Ho una funzione con una firma di tipo (x, y : SomeType) -> (cond x y) = True -> SomeType
. Quando controllo la condizione in if-then-else/case/with statement, come faccio a passare alla funzione in un ramo corrispondente il fatto, quella condizione è vera?Comunica la funzione dipendente nel ramo dell'istruzione condizionale che la condizione è vera
risposta
È possibile utilizzare DecEq
per rendere questo facile:
add : (x, y : Nat) -> x + y < 10 = True -> Nat
add x y _ = x + y
main : IO()
main =
let x = S Z
in let y = Z
in case decEq (x + y < 10) True of
Yes prf => print (add x y prf)
No _ => putStrLn "x + y is not less than 10"
Ma non si dovrebbe.
L'utilizzo di booleani (tramite =
o So
) può dirvi che qualcosa è vero, ma non perché. Il perché è molto importante se si desidera comporre prove insieme o spezzarle. Immaginate se add
abbia chiamato una funzione che aveva bisogno di x + y < 20
- non possiamo semplicemente superare la nostra prova che x + y < 10 = True
perché Idris non sa nulla dell'operazione, solo che è vero.
Invece, dovresti scrivere quanto sopra con un tipo di dati che contiene perché è vero. LTE
è un tipo che fa che per i confronti di meno-che:
add : (x, y : Nat) -> LTE (x + y) 10 -> Nat
add x y _ = x + y
main : IO()
main =
let x = S Z
in let y = Z
in case isLTE (x + y) 10 of
Yes prf => print (add x y prf)
No _ => putStrLn "x + y is not less than 10"
Ora, se add
chiamato una funzione che aveva bisogno di un LTE (x + y) 20
possiamo scrivere una funzione di ampliare il vincolo:
widen : a `LTE` b -> (c : Nat) -> a `LTE` (b + c)
widen LTEZero c = LTEZero
widen (LTESucc x) c = LTESucc (widen x c)
Questo è non qualcosa che possiamo facilmente fare con i soli booleani.
- 1. Bash: impossibile entrare se anche la condizione è vera
- 2. Sospendi e verifica fino a quando la condizione è vera
- 3. Unisci più elenchi se la condizione è vera
- 4. Applicare la funzione condizionale
- 5. "La richiesta condizionale non è riuscita" mentre la condizione funziona
- 6. Che cos'è la digitazione dipendente?
- 7. Operatore condizionale con solo affermazione vera
- 8. Qual è la condizione preferita nel ciclo?
- 9. Mocking condizionale: chiamare la funzione originale se la condizione corrisponde a
- 10. Se la proposizione è sempre vera con enum nel confronto
- 11. Chiamata condizionale funzione asincrona nel nodo
- 12. Perché altrimenti il blocco viene eseguito anche se la condizione è vera?
- 13. La vera interoperabilità SOAP è un mito?
- 14. Qual è la vera definizione dell'algoritmo xorshift128 +?
- 15. Evidenzia fila quando la casella è vera
- 16. variabile Assegna all'interno di condizione, se vera
- 17. Assegna solo se la condizione è vera nell'operatore ternario in JavaScript
- 18. Formattazione condizionale usando la funzione AND()
- 19. Come fare "se non vera condizione"?
- 20. Requirejs - Caricamento moduli solo se una condizione è vera
- 21. In che modo OpenGL comunica con la GPU?
- 22. La vera definizione di immutabilità?
- 23. Cosa restituisce il browser browser.wait se la condizione non diventa mai vera?
- 24. Come mai una stampa viene eseguita dopo che una condizione vera è stata testata?
- 25. IntelliJ Punto di interruzione condizionale Idea (debug) dipendente da altri punti di interruzione
- 26. Qual è la "condizione di copertura"?
- 27. Chiama la funzione Javascript esterna dai componenti che reagiscono
- 28. Regole sovrapposte nei CSS: qual è la vera logica dietro?
- 29. condizionato DUPLICATE KEY UPDATE (aggiornamento solo se certa condizione è vera)
- 30. Qual è la vera differenza tra ACTION_GET_CONTENT e ACTION_OPEN_DOCUMENT?