2010-09-15 16 views
12

Scala ha un operatore simile a 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

Per rendere la domanda indipendente, sarebbe bello se tu spiegassi cosa è/fa il costrutto di Haskell. –

+1

$ è apparentemente giusto-associativo e ha una precedenza bassa http://learnyouahaskell.com/higher-order-functions#function-application. – huynhjl

risposta

18

Sì, è scritto "Applica"

fn apply arg 

Non c'è nessun operatore la punteggiatura standard per questo, ma sarebbe abbastanza facile aggiungere uno via libreria sfruttamento della prostituzione.

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) 

In generale, mentre il codice Scala è molto più denso di Java, non è abbastanza denso come Haskell. Quindi, c'è meno payoff nella creazione di operatori come "$" e "."

+8

Una delle più grandi vincite di '$' è il suo uso nelle sezioni operatore: '(f $)' e '($ x)', che non esistono in Scala (dovresti scrivere 'f (_)' e '_ (x)' invece, ma non è possibile farlo in Haskell). –

+4

apply è left-associative. $ è giusto-associativo. – Anonymous