2011-08-28 14 views
8

In chapter 4 di Erik Meijer su Fondamenti di programmazione funzionale, scrive in sostanza:definire manualmente combinazione booleana

True &&& x | x == True = True 
      | x == False = False 

Non è questo inutilmente verboso? Non potrei solo scrivere:

True &&& x = x 

o anche:

(&&&) True = id 

(&&&) False = const False   

A proposito, come mai non riesco a scrivere la seguente?

(True &&&) = id 

(False &&&) = const False   

ghci risponde con:

Parse error in pattern: True &&& 

risposta

12

Sì, il modo in cui si definisce è meglio. Da Preludio:

True && x = x 
False && _ = False 

È possibile utilizzare solo le sezioni nelle espressioni, non nei modelli. Non c'è una ragione profonda per cui (True &&) non dovrebbe essere consentito in un modello. Ma è una cosa così rara da volere che non penso valga la pena la complicazione.

+0

N.B. Penso che * puoi * scriverlo come '(&&)' in uno schema. Quindi '(&&) True = id' potrebbe funzionare. –

+0

Sì, ma (&&) non è una sezione, ma la forma di prefisso di un operatore infisso, penso. –

+0

@Erik Hesselink yes, ma non c'è differenza semantica tra "un operatore prefisso" e "una sezione a doppia faccia". Il linguaggio consente solo una sintassi quando si definiscono gli operatori e non l'altro. – Carl