Bilinen bir gerçek şu ki, yeterli dil uzantılarını (ghc) açarsanız, Haskell dinamik olarak yazılmış bir yorumlanmış dil haline gelir! Örneğin, aşağıdaki program toplama işlemini uygular.
{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
data Zero
data Succ a
class Add a b c | a b -> c
instance Add Zero a a
instance (Add a b c) => Add (Succ a) b (Succ c)
Bu artık Haskell'e benzemiyor. Birincisi, nesneler üzerinde çalışmak yerine türler üzerinde çalışıyoruz. Her sayı kendi tipidir. Fonksiyonlar yerine tip sınıflarımız var. İşlevsel bağımlılıklar, bunları türler arasında işlev olarak kullanmamızı sağlar.
Peki kodumuzu nasıl çağırıyoruz? Başka bir sınıf kullanıyoruz
class Test a | -> a
where test :: a
instance (Add (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)
=> Test a
Bu test
, tipini 4 + 3 tipine ayarlar . Bunu ghci'de açarsak, test
bunun gerçekten tip 7 olduğunu göreceğiz :
Ok, one module loaded.
*Main> :t test
test :: Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))
Görev
İki Peano rakamını (negatif olmayan tamsayılar) çarpan bir sınıf uygulamanızı istiyorum. Peano rakamları yukarıdaki örnekte aynı veri türleri kullanılarak oluşturulacaktır:
data Zero
data Succ a
Ve sınıfınız da yukarıdaki gibi değerlendirilecektir. Sınıfınıza dilediğinizi adlandırabilirsiniz.
Baytlara ücretsiz olarak istediğiniz ghc dil uzantılarını kullanabilirsiniz.
Test Durumları
Bu test senaryoları sınıfınızın adlandırıldığını varsayar M
, isterseniz başka bir ad verebilirsiniz.
class Test1 a| ->a where test1::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)=>Test1 a
class Test2 a| ->a where test2::a
instance (M Zero (Succ (Succ Zero)) a)=>Test2 a
class Test3 a| ->a where test3::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ Zero) a)=>Test3 a
class Test4 a| ->a where test4::a
instance (M (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))) (Succ (Succ (Succ Zero))) a)=>Test4 a
Sonuçlar
*Main> :t test1
test1
:: Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))
*Main> :t test2
test2 :: Zero
*Main> :t test3
test3 :: Succ (Succ (Succ (Succ Zero)))
*Main> :t test4
test4
:: Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))))))))
Tipik teknik röportajdan ilham alır