2012-02-04 45 views
15

Tôi mới sử dụng Haskell và, nói chung, để lập trình hàm và tôi hơi khó chịu với cú pháp của nó.Biểu tượng => có nghĩa là gì trong Haskell?

Trong mã sau, mã số => là gì? Và cũng có thể (Num a, Ord a)?

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t 

Trả lời

23

Đây là hạn chế về kiểu chữ; (Num a, Ord a) => ... có nghĩa là loop hoạt động với bất kỳ loại a nào là một phiên bản của NumOrd kiểu chữ, tương ứng với loại số và loại đặt hàng tương ứng. Về cơ bản, bạn có thể nghĩ về loop là có loại ở bên phải của =>, ngoại trừ a được yêu cầu là một phiên bản NumOrd. Bạn có thể nghĩ về typeclasses về cơ bản tương tự như giao diện OOP (nhưng chúng không giống nhau!) - chúng đóng gói một tập hợp các định nghĩa mà bất kỳ cá thể nào phải hỗ trợ và mã chung có thể được viết bằng các định nghĩa này. Ví dụ: Num bao gồm các phép toán số như phép cộng và phép nhân, trong khi Ord bao gồm ít hơn, lớn hơn, v.v.

Để biết thêm thông tin về typeclasses, hãy xem this introduction từ Learn You a Haskell.

1

Ở phía bên trái của => bạn khai báo ràng buộc đối với các loại được sử dụng ở bên phải.

Trong ví dụ bạn đưa ra, điều đó có nghĩa là a bị ràng buộc là trường hợp của cả loại lớp Ord và loại lớp học Num.

8

=> tách hai phần của một loại chữ ký:

  • Ở bên trái, typeclass chế
  • Ở bên phải, loại thực

Vì vậy, bạn có thể nghĩ đến (Num a, Ord a) => a -> (t -> t) -> t -> t như ý nghĩa " loại là a -> (t -> t) -> t -> t và cũng phải có một phiên bản Num cho a và một phiên bản Ord cho a ".

Để biết thêm về typeclasses thấy http://www.learnyouahaskell.com/types-and-typeclasses

4

Một cách để suy nghĩ về nó là Ord aNum a là đầu vào bổ sung cho các chức năng. Chúng là kiểu đầu vào đặc biệt mặc dù: từ điển. Khi bạn sử dụng chức năng này với một loại cụ thể a, cũng phải có từ điển có sẵn cho các hoạt động OrdNum trên loại a.

Bất kỳ chức năng nào sử dụng chức năng có đầu vào từ điển cũng phải có cùng đầu vào từ điển.

foo :: (Num a, Ord a) => a -> t 
foo x = loop x someFunc someT 

Tuy nhiên, bạn không phải chuyển các từ điển này một cách rõ ràng.Haskell sẽ chăm sóc điều đó cho bạn, giả sử có một từ điển có sẵn. Bạn có thể tạo một từ điển với một ví dụ về kiểu chữ typeclass.

instance Num MyType with 
    x + y = ... 
    x - y = ... 
    ... 

này tạo ra một từ điển cho Num hoạt động trên MyType, do đó MyType thể được sử dụng bất cứ nơi nào mà Num a là một đầu vào cần thiết (giả sử nó đáp ứng các yêu cầu khác, tất nhiên).

+1

Điều đáng nói là mặc dù chúng tôi gọi chúng là "từ điển", chúng là các bảng băm chứ không phải là các bản ghi hàm. Chúng giống như các bảng v trong các ngôn ngữ hướng đối tượng, ngoại trừ chúng không gắn liền với các giá trị. – hammar

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