2011-01-13 17 views
6

Bộ sưu tập các bộ sưu tập Scala có một số thuộc tính khá thú vị và tôi tự hỏi làm thế nào người ta sẽ thực hiện nó trong Haskell; hoặc nếu nó thậm chí có thể (hoặc một ý tưởng tốt nói chung). Tôi là một chút của một newbie haskell vì vậy tôi muốn nghe suy nghĩ của bạn.Có thể tạo một tập hợp api như Scala 2.8 trong Haskell không?

Định nghĩa bản đồ scala trông như thế này:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That 

Một tính năng thú vị của API này là nếu bạn ánh xạ qua một chuỗi và chức năng bản đồ của bạn trả về một nhân vật, kết quả sẽ là kiểu string (và không phải danh sách các ký tự).

+3

Trong Haskell, một chuỗi * là * một danh sách các nhân vật. (Điều này không trả lời câu hỏi của bạn trong trường hợp chung, nhưng tôi nghĩ nó không đáng gì cả.) – mipadi

+2

Một thư viện API Scala (2.8) giải quyết xung quanh việc xử lý các loại * hiện có và cách chơi độc đáo với chúng. Hai ví dụ lớn nhất có khả năng là 'String' và mảng. Nếu không có các vấn đề về kiểu hiện có, tôi tin rằng phần lớn các trình xây dựng ngầm là không cần thiết (chúng được thiết kế để cho phép "thu gọn" thành một thùng chứa cùng kiểu với đầu vào). –

+3

pst, không phải vậy. Xem ví dụ này từ Martin Odersky (http://stackoverflow.com/questions/1722726/is-the-scala-2-8-collections-library-a-case-of-the-longest-suicide-note-in-histo/1728140 # 1728140) trong đó vấn đề là BitSet có một đại diện rất hiệu quả chỉ tương thích với int nhưng chúng tôi vẫn muốn có thể xử lý nó như bất kỳ Set với bản đồ vv. Nếu nó chỉ là một vấn đề "hiện có loại" sau đó BitSet có thể được loại bỏ. –

Trả lời

6

Chúng tôi có thứ gì đó gần như chung chung như API Scala. Nó được gọi là Foldable.

class Foldable t where 
    fold :: Monoid m => t m -> m 
    foldMap :: Monoid m => (a -> m) -> t a -> m 
    foldr :: (a -> b -> b) -> b -> t a -> b 
    foldl :: (a -> b -> a) -> a -> t b -> a 
    foldr1 :: (a -> a -> a) -> t a -> a 
    foldl1 :: (a -> a -> a) -> t a -> a 

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Foldable.html

+0

Bằng cách sử dụng 'foldMap' tập hợp kết quả (tương đương với' That' từ Scala), phụ thuộc vào monoid nào được chọn? Tất cả các bộ sưu tập đều là monoids? –

+1

@Grazer, gần như tất cả các bộ sưu tập đều là monoids. Đặc biệt tất cả các bộ sưu tập được cung cấp bởi gói container có các cá thể Monoid. Tập hợp con lớn nhất của các bộ sưu tập không phải monoid đến trong tâm trí là các bộ sưu tập phải chứa ít nhất một phần tử, bởi vì một monoid yêu cầu một bộ nhận dạng (ví dụ: trống). –

2

tôi muốn nói chức năng bản đồ này trong Scala là thực sự ngày càng tiến tới từ Haskell:

fmap :: (Functor f) => (a -> b) -> f a -> f b 

Trường hợp loại danh sách chỉ là một functor.

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