2010-09-15 12 views
12

¿Scala tiene un operador similar al Haskell's $?

-- | Application operator. This operator is redundant, since ordinary 
-- application @(f x)@ means the same as @(f '$' x)@. However, '$' has 
-- low, right-associative binding precedence, so it sometimes allows 
-- parentheses to be omitted; for example: 
-- 
-- >  f $ g $ h x = f (g (h x)) 
-- 
-- It is also useful in higher-order situations, such as @'map' ('$' 0) [email protected], 
-- or @'Data.List.zipWith' ('$') fs [email protected] 
{-# INLINE ($) #-} 
($)      :: (a -> b) -> a -> b 
f $ x     = f x 
+11

Con el fin de hacer que la pregunta sea independiente, sería bueno si explicaras lo que es/es la construcción de Haskell. –

+1

$ es aparentemente correcto asociativo y tiene una baja precedencia http://learnyouahaskell.com/higher-order-functions#function-application. – huynhjl

Respuesta

18

Sí, está escrito en "Aplicar"

fn apply arg 

No hay operador de puntuacion estándar para esto, pero sería bastante fácil añadir una biblioteca a través de proxenetismo.

class RichFunction[-A,+B](fn: Function1[A, B]){ def $(a:A):B = fn(a)} 
    implicit def function2RichFunction[-A,+B](t: Function1[A, B]) = new RichFunction[A, B](t) 

En general, aunque el código de Scala es mucho más denso que Java, no es tan denso como Haskell. Por lo tanto, hay menos ventajas de crear operadores como '$' y '.'

+8

Una de las ganancias más grandes de '$' es su uso en las secciones de operador: '(f $)' y '($ x)', que no existen en Scala (escribirías 'f (_)' y '_ (x)' en su lugar, pero no puedes hacer eso en Haskell). –

+4

aplicar es de izquierda asociativo. $ tiene una asociación correcta. – Anonymous

Cuestiones relacionadas