2010-09-15 21 views
12

Scala, Haskell's $ benzeri bir operatöre sahip mi?

-- | 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

Soruyu tek başına yapmak adına, Haskell'in yaptıklarını/yaptıklarını açıkladıysanız hoş olurdu. –

+1

$ görünüşte doğru-ilişkilendirici ve düşük bir önceliğe sahiptir http://learnyouahaskell.com/higher-order-functions#function-application. – huynhjl

cevap

18

Evet öyle

fn apply arg 

bunun için standart bir noktalama operatör var "uygulamak" yazmış ama kütüphane pimping yoluyla bir tane eklemek için yeterince kolay olurdu.

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) 

Genelde, Scala kodu Java'dan çok daha yoğun olsa da, Haskell kadar yoğun değil. Böylece, '$' ve '.' Gibi operatörler yaratmak için daha az kazanç var.

+8

"$' nin büyük kazanımlarından biri, operatör bölümlerinde kullanımıdır: "(f $)" ve "($ x)", Scala'da bulunmaz ('f (_)' yazıp '_ (x)' yerine, ama bunu Haskell’te yapamazsınız. –

+4

başvuru sol ilişkiseldir. $ doğru çağrışımcı. – Anonymous

İlgili konular