2010-09-15 28 views
12

Scala có một nhà điều hành tương tự như 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

Để làm cho câu hỏi đứng một mình, nó sẽ là tốt đẹp nếu bạn giải thích những gì mà Haskell xây dựng là/không. –

+1

$ dường như là hợp pháp và có ưu tiên thấp http://learnyouahaskell.com/higher-order-functions#function-application. – huynhjl

Trả lời

18

Vâng, nó được viết "áp dụng"

fn apply arg 

không có toán tử dấu chấm câu chuẩn cho điều này, nhưng nó sẽ là đủ dễ dàng để thêm một thư viện thông qua yếu đuối.

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) 

Nói chung, trong khi mã Scala đậm đặc hơn Java, nó không hoàn toàn dày đặc như Haskell. Vì vậy, có ít tiền thắng hơn để tạo các toán tử như '$' và '.'

+8

Một trong những thắng lớn hơn của '$' là việc sử dụng nó trong các toán tử: '(f $)' và '($ x)', không tồn tại trong Scala (bạn viết 'f (_)' và '_ (x)' thay vào đó, nhưng bạn không thể làm điều đó trong Haskell). –

+4

áp dụng là kết hợp trái. $ là liên kết đúng. – Anonymous

Các vấn đề liên quan