2012-06-19 37 views
25

Làm thế nào tôi có thể có nhiều hạn chế lớp, vì vậy nếu A là một EqB là một Num, tôi có thể nói một trong haiHaskell loại chữ ký với nhiều khó khăn lớp

f :: Eq a => a -> b` 

hoặc

f :: Num b => a -> b 

Vì vậy, , làm cách nào tôi có thể có Eq a =>Num b => cùng một lúc?

  • f :: Eq a => Num b => a -> b,
  • f :: Eq a -> Num b => a -> b, và
  • f :: Eq a, Num b => a -> b

không làm những gì tôi muốn.

Trả lời

42

Chúng thường được gọi là các ràng buộc của lớp, dưới dạng EqNum được gọi là loại lớp.

Làm thế nào về điều này?

f :: (Eq a, Num b) => a -> b 

Dấu ngoặc đơn là quan trọng.

+1

Aha! Cảm ơn bạn. Làm các dấu ngoặc đơn với dấu phẩy gây ra một bộ cấp cao hơn của một số loại, hoặc là một ý nghĩa khác của dấu ngoặc đơn? –

+7

@Andrew thực sự họ làm (bây giờ) mặc dù bạn có lẽ không nên lo lắng cho mình về những điều như vậy được nêu ra. Các kiểu Normall Haskell có * type * (kiểu kiểu) '*', vì vậy kiểu tuple có kiểu '* -> * -> *'. Trong các phiên bản gần đây của GHC, có một loại 'Constraint' mới như' Eq :: * -> Constraint', và các tuple đã được phát triển thành kiểu mới này. –

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