2010-09-15 20 views
12

Czy Scala ma operatora podobnego do 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

W trosce o samo pytanie, byłoby miło, gdybyś wyjaśnił, co to jest/robi konstrukt Haskella. –

+1

$ jest najwyraźniej prawostronny i ma niski priorytet http://learnyouahaskell.com/higher-order-functions#function-application. – huynhjl

Odpowiedz

18

Tak, to jest napisane „stosować”

fn apply arg 

Nie ma standardowy operator interpunkcyjne za to, ale byłoby to dość łatwe do dodasz za stręczycielstwo biblioteki.

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) 

Ogólnie rzecz biorąc, podczas gdy kod Scala jest dużo gęstszy niż Java, nie jest tak gęsty jak Haskell. W ten sposób mniej jest pieniędzy na tworzenie operatorów takich jak "$" i "."

+8

Jedną z większych wygranych '$' jest jego użycie w sekcjach operatorskich: '(f $)' oraz '($ x)', których nie ma w Scali (napisałeś 'f (_)' i '_ (x)' zamiast tego, ale nie możesz tego zrobić w Haskell). –

+4

stosuje się lewostronnie. $ jest prawostronne. – Anonymous

Powiązane problemy