2017-07-20 22 views
6

Haskell mới làm quen ở đây. Tôi biết từ type classes rằng => có nghĩa là "trong ngữ cảnh". Tuy nhiên, tôi không thể đọc được các loại sau đây, được tìm thấy trong mô-đun Statistics.SampleLoại này là gì?

(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double 

gì trở ngại đang được áp dụng trên v trái =>?

+0

Tôi không chắc chắn nơi bạn có "trong ngữ cảnh từ". Ý nghĩa của nó là gần hơn với "Nếu các ràng buộc ở phía bên trái được đáp ứng, một hàm có kiểu được cho bên phải tồn tại". – Cubic

Trả lời

10

Các Data.Vector.Generic.Vector typeclass nhận hai đối số loại, va nơi v :: * -> * là loại container và a :: * là loại các yếu tố trong container. Đây chỉ đơn giản là một giao diện chung cho các loại vectơ được xác định trong gói vector, đặc biệt là Data.Vector.Unboxed.Vector.

Điều này chủ yếu nói rằng loại v phải có thể giữ (Double, Double)Double, mặc dù không đồng thời. Nếu bạn đã sử dụng v ~ Data.Vector.Unboxed.Vector thì điều này chỉ hoạt động tốt. Lý do là do việc triển khai correlation, sử dụng unzip. Hàm này tách một số v (a, b) thành (v a, v b). Vì correlation đang hoạt động trên v (Double, Double), cần có hạn chế bổ sung là v có thể giữ Double giây.

Loại chung này có nghĩa là làm cho chức năng correlation hoạt động với nhiều loại hơn Data.Vector.Vector, bao gồm bất kỳ loại kiểu vector nào có thể được triển khai trong các thư viện khác.


Tôi muốn nhấn mạnh rằng những khó khăn

Data.Vector.Generic.Vector v (Double, Double) 
Data.Vector.Generic.Vector v Double 

Nhà nước mà bất cứ loại bạn chọn cho v là khả năng giữ (Double, Double) và cũng có khả năng giữ Double. Điều này là xác định các điều kiện tiên quyết nhất định cho loại vectơ của bạn, chứ không phải các nội dung thực tế của vectơ. Nội dung thực tế của vectơ được xác định trong đối số đầu tiên với hàm correlation.

+0

Vì vậy, 'Foo a, Bar a => a -> Int' hy vọng là một trong hai loại Foo hoặc Bar? Điều gì về phần tiếp theo của chữ ký - tại sao 'v' được chỉ định như một bộ tuple, thay vì chỉ' v', vì chúng ta đã hạn chế nó? – Vorac

+0

Điều đó có nghĩa là 'a' phải có triển khai cho cả' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Ràng buộc được đưa ra với "cú pháp tuple" vì đó là cú pháp cho nhiều ràng buộc. Bạn thực sự phải làm '(Foo a, Bar a) => a -> Int', không có parens nó sẽ không biên dịch. Những gì tôi đang nói ở trên là 'v' bị ràng buộc là một' Vector' chung có khả năng giữ '(Double, Double)' hoặc 'Double'. Điều này không có nghĩa là có một vector có các phần tử đồng thời '(Đôi, Đôi)' và 'Double' (tôi đang nghĩ về Python có thể thực hiện' [(1.0, 2.0), 3.0] '). – bheklilr

+0

Python - C của lập trình hàm. – Vorac