2016-06-20 40 views
8

:Haskell'deki veri türü ve değer yapıcı için aynı adı kullanmak yaygın mıdır? Aşağıdaki kodu baktığımızda

aşağıdaki metinle bu kod örneği eşlik Büyük İyi için size Haskell bilgi kitaptan
data Point = Point Float Float deriving (Show) 
data Shape = Circle Point Float | Rectangle Point Point deriving (Show) 

: Bir noktayı tanımlayan o

Bildirimi Veri türü ve değer yapıcı için aynı adı kullandık. Bu, özel bir anlamı yoktur, ancak tek bir değer yapıcısı varsa, türle aynı adı kullanmak yaygındır.

Şimdi benim varsayım data Point = ... veri türüdür ve ... = Point Float... değer yapıcı olmasıdır.

Soruma ilişkin soru: Haskell'deki veri türü ve değer yapıcı için aynı adı kullanmak yaygın mıdır?

+2

Evet, öyle. Bununla birlikte, genellikle "data" yerine "newtype" kullanırız. Örneğin, 'State' genellikle şöyle tanımlanır:' newtype State a a = State {runState :: s -> (a, s)} '. –

+2

@AaditMShah Yalnızca tek alanlı kurucular için çalışır. Her seferinde bir tuple açmak istemediğiniz sürece, 'Point' için 'newtype' kullanamazsınız. – Zeta

+1

Haskell'i, bazı dillerde (ör. Java), yapıcının * her zaman * ile aynı adı taşıyan birisine açıkladığımda bana bir kez işaret ettim. Yani, Haskell'e gelen biri için, farklı kurucu isimlere sahip olmak kafa karıştırıcı olabilir. – user2297560

cevap

9

Sınırlı deneyimimden: Evet. Bu da mantıklı. Neden burada Point'u farklı arayacaksın? Mükemmel veri türünü açıklar ve ayrıca sadece fonksiyonun tipi imzası veri türünü koyabilirsiniz çünkü kesin olan bu

myFunc :: Point -> Bool 
myFunc (Point 0 0) = True 
myFunc _ = False 

gibi desen eşleştirme için kullanmak açıktır.

+2

Çok anlam ifade ediyor. Bir dezavantajı, yeni başlayanların ilk önce dili öğrenmesi biraz kafa karıştırıcı olması. Bu noktanın farklı bağlamlarda iki farklı unsuru temsil ettiğini izlemek zor. Bu, projelerinizde veya işinizde nasıl kod yazdığınızı etkilememeli, ancak Haskell çevresinde bir giriş müfredatı tasarlamanız gerekiyorsa, akılda tutulması gereken bir şeydir. –