Non possibile. Quando si esegue lo schema di corrispondenza con with
, i tipi nel contesto vengono aggiornati con le informazioni estratte dal costruttore corrispondente. case
non causa questo aggiornamento.
A titolo di esempio, le seguenti opere con with
ma non con case
:
import Data.So
-- here (n == 10) in the goal type is rewritten to True or False
-- after the match
maybeTen : (n : Nat) -> Maybe (So (n == 10))
maybeTen n with (n == 10)
maybeTen n | False = Nothing
maybeTen n | True = Just Oh
-- Here the context knows nothing about the result of (n == 10)
-- after the "case" match, so we can't fill in the rhs
maybeTen' : (n : Nat) -> Maybe (So (n == 10))
maybeTen' n = case (n == 10) of
True => ?a
False => ?b
fonte
2016-02-24 19:05:48
molte grazie per la risposta Andras. – jhegedus
Quindi in pratica 'with' è una sorta di' caso' che ha una connessione "più forte" al livello di tipo di quanto non sia il semplice 'case'. Parlando molto liberamente. – jhegedus
IIRC 'con' desugars in una nuova definizione di livello superiore che ha gli argomenti extra rispetto alla funzione genitore, ed è fondamentalmente la definizione di funzione che impone/aggiorna tutte le dipendenze di tipo nei pattern degli argomenti. –