2016-02-24 16 views

risposta

6

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 
+0

molte grazie per la risposta Andras. – jhegedus

+0

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

+2

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. –