2011-08-28 4 views
8

En chapter 4 de Erik Meijer en los fundamentos de la programación funcional, que esencialmente escribe:definir manualmente junto booleano

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

¿No es esto innecesariamente prolijo? ¿No podría escribir:

True &&& x = x 

o incluso:

(&&&) True = id 

(&&&) False = const False   

Por cierto, ¿cómo es que no puedo escribir lo siguiente?

(True &&&) = id 

(False &&&) = const False   

ghci responde con:

Parse error in pattern: True &&& 

Respuesta

12

Sí, la forma en que lo define es mejor. Desde el Preludio:

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

Sólo puede utilizar secciones en las expresiones, no en los patrones. No hay una razón profunda por la cual (True &&) no se debe permitir en un patrón. Pero es algo tan raro de querer que no creo que valga la pena la complicación.

+0

N.B. Creo que * puedes * escribirlo como '(&&)' en un patrón. Entonces '(&&) True = id' podría funcionar. –

+0

Sí, pero (&&) no es una sección, pero la forma de prefijo de un operador infijo, creo. –

+0

@ Erik Hesselink sí, pero no hay diferencia semántica entre "un operador de prefijo" y "una sección de doble faz". El lenguaje solo permite una sintaxis al definir operadores, y no el otro. – Carl