2013-09-01 37 views
15

Trong Haskell, ((->) t) có nghĩa là gì trong chữ ký kiểu của các cá thể? Ví dụ Functor, Ứng dụng và Monad tất cả đều có một thể hiện dọc theo các dòng:((->) t) có nghĩa là gì trong Haskell?

Functor ((->) r) 

Tôi không thể tìm thấy bất kỳ giải thích nào về ý nghĩa của chữ ký này và tính năng chống công cụ tìm kiếm cao.

+3

'cao công cụ tìm kiếm-resistant' - không phải cho động cơ SO tìm kiếm. Xem http://stackoverflow.com/q/5310203/11683 – GSerg

+1

Bạn nói đúng! Tôi đoán tôi nên xem xét đôi khi tìm kiếm SO trực tiếp thay vì chỉ dựa vào Google. – drt

+0

Bạn cũng có thể tìm kiếm trên [SymbolHound] (http://www.symbolhound.com/?q=Functor+%28%28-%3E%29+r%29). –

Trả lời

19

-> là một trình tạo kiểu kết hợp. Bạn có thể so sánh nó với : - một hàm tạo giá trị infix cho loại danh sách. Để sử dụng : một mình chúng ta đặt dấu ngoặc xung quanh nó để nó trở thành một ứng dụng chức năng tiền tố:

(:) a b cũng giống như a : b

Tương tự, (->) a b cũng giống như a -> b, loại của một hàm a-b.

(->) a là một ứng dụng một phần của hàm tạo kiểu, và chính nó là một hàm tạo kiểu loại * -> *.

Bạn có thể coi đó là "hàm tạo của các loại hàm từ". Ví dụ. (->) Int là một hàm tạo của các loại hàm từ Int. Bạn có thể tạo loại chức năng đầy đủ bằng cách chuyển một loại khác cho nó: (->) Int String là loại chức năng từ Int đến String.

instance Functor (->) a là một hàm sĩ có hoạt động fmap chuyển đổi một hàm a -> b thành hàm a -> c. Bạn có thể so sánh nó với một số instance Functor (Either a) tương tự có bản đồ Either a b đến Either a c bằng cách áp dụng đối số fmap cho Right giá trị.

+0

Cảm ơn. Điều này chủ yếu là có ý nghĩa với tôi. Vẫn còn hơi mới với Haskell vì vậy nó sẽ đưa tôi một thời gian để tiêu hóa. – drt

+7

Các trường hợp '(->) r' là * rất * khó hiểu, theo ý kiến ​​của tôi. Tôi cảm thấy tương đối tự tin với rất nhiều Haskell, nhưng tôi vẫn không có trực giác cho tất cả các trường hợp '(->) r' hoạt động như thế nào.Tôi có thể * sử dụng * chúng, bởi vì tôi sử dụng chúng tất cả các thời gian, vì vậy nó không phải là rất lạ với tôi nữa. Chỉ là tôi sẽ không nói rằng tôi hiểu họ sâu sắc. Đừng lo lắng nếu bạn không. Tôi chắc chắn rằng nó sẽ đến với cả hai chúng tôi trong thời gian. – kqr

+0

@kqr Khi bạn biết những gì các ví dụ Monad không, tôi nghĩ rằng bạn có thể lấy được nó một cách tốt đẹp. Ghi chú nhỏ này tôi đã viết bắt đầu với một định nghĩa rất chi tiết (nhưng tôi hy vọng một chút dễ hiểu) về '>> =', và sau đó chỉ ra cách, khi chơi gôn đúng cách, nó giống hệt với việc thực hiện thông thường bạn có thể biết từ LYAH ví dụ. https://github.com/quchen/articles/blob/master/reader_instance_derived.md#bind – David

4

Bạn có thể xem đó là tập hợp các loại r -> a trong đó r được sửa.

Hàm functor là một loại hàm m, có nghĩa là đối với bất kỳ loại a bạn có loại m a. Ví dụ: Maybe, [](->) r. Sau này có lẽ tốt hơn nên được viết (r ->), nhưng tôi không biết nếu điều đó được cho phép.

10

Chúng ta có thể sử dụng chức năng lambda và chức năng ghi vào:

(->) a = \b -> (->) a b --pseudo-Haskell 
(->) a = \b -> a -> b --pseudo-Haskell 

như vậy, đọc ví dụ như:

class Functor f where 
    fmap :: (a->b) -> f a -> f b 

instance Functor ((->)r) where 
    fmap :: (a->b) -> f  a -> f  b 
     = (a->b) -> (->)r a -> (->)r b --pseudo-Haskell 
     = (a->b) -> (r -> a) -> (r -> b) --pseudo-Haskell 
+1

Điều này thực sự khá hữu ích cho trực giác của tôi. Tôi cần phải làm điều tương tự cho trường hợp ứng dụng của '(->) r'! – kqr