2017-07-20 56 views
6

Haskell acemi burada. type classes'dan, =>'un "bağlamında" anlamına geldiğini biliyorum. Oysa ben kısıtlamalar => ait v solda uygulanıyor NeBu tür nedir?

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

modül Statistics.Sample bulunan aşağıdaki türü, okuyamaz?

+0

"Bağlamında" bulunduğunuzdan emin değilim. Bunun anlamı, "Sol taraftaki kısıtlamalar yerine getirilirse, sağ taraftaki tipte bir işlev bulunur" ifadesine daha yakındır. – Cubic

cevap

10

Data.Vector.Generic.Vector typeclass v :: * -> * kap türüdür ve a :: * kapta elemanlarının türü iki tür bağımsız değişkenleri, v ve a alır. Bu, vector paketinde tanımlanan vektör türleri için, özellikle Data.Vector.Unboxed.Vector için genel bir arabirimdir.

Bu, temel olarak v türünün (Double, Double) ve Double türlerini aynı anda olmasa da tutabilmesi gerektiğini söylemektedir. Eğer v ~ Data.Vector.Unboxed.Vector'u kullanacak olursanız, bu sadece iyi çalışır. Nedeni, unzip kullanan correlation, uygulanmasından kaynaklanmaktadır. Bu işlev v (a, b)'u (v a, v b)'a böler. correlation, v (Double, Double) üzerinde çalıştığı için, v'un Double s değerini tutabileceği ek kısıtlamaya ihtiyaç duyar.

Bu genel tür, correlation işlevinin Data.Vector.Vector'dan daha fazla türde çalışmasını sağlamak içindir, diğer kitaplıklarda uygulanabilecek herhangi bir vektör stili türü de dahil olmak üzere.


Ben v(Double, Double) tutma kapasitesine sahiptir ve aynı zamanda Double tutma kapasitesine sahiptir için seçtiğiniz herhangi tipin bu kısıtlamalar

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

Devlet vurgulamak istiyoruz. Bu, vektör türünüzün gerçek içeriğini değil, vektör türünüz için belirli önkoşulları belirtir. Vektörün gerçek içeriği, correlation işlevinin ilk bağımsız değişkeninde belirtilmiştir.

+0

Yani 'Foo a, Bar a => a -> Int', Foo veya Bar tip sınıfından biri olmasını bekliyor? İmzanın bir sonraki kısmına ne dersiniz - niçin 'v' bir tuple olarak belirtiliyor, sadece 'v' yerine, onu zaten kısıtlıyoruz? – Vorac

+0

Bu, "a" nın hem Foo hem de "Bar" için de uygulamaları olması gerektiğini söyler. Kısıtlama, "tuple sözdizimi" ile verilir; çünkü bu, birden çok kısıtlamanın sözdizimi. Aslında (Foo a, Bar a) => a -> Int' yapmak zorunda değilsiniz; Yukarıda diyorum ki, 'v', '(Çift, Çift)' veya 'Çifte' tutabilen genel bir 'Vektör' olmakla sınırlıdır. Bu, elemanları eşzamanlı olarak (Çift, Çift) ve “Çift” olan bir vektörün olduğu anlamına gelmez (Python'un [(1.0, 2.0), 3.0] 'ı yapabildiğini düşünüyorum). – bheklilr

+0

Python - işlevsel programlamanın C'si. – Vorac