2013-04-13 42 views
9

Haskell中是否有類型聲明的位置標準?類型聲明的標準佈局

例如,假設我有兩個功能:

abs' x = if x >= 0 then x else -x 

pow x 0 = 1 
pow x e = x * (pow x (e-1)) 

和它們的類型聲明是:

abs' :: Int -> Int 
pow :: Int -> Int -> Int 

它是更合適的/可讀放置聲明在該文件的頂部,像這樣:

abs' :: Int -> Int 
pow :: Int -> Int -> Int 

abs' x = if x >= 0 then x else -x 

pow x 0 = 1 
pow x e = x * (pow x (e-1)) 

或將每個上面各自的功能,如在:

abs' :: Int -> Int 
abs' x = if x >= 0 then x else -x 

pow :: Int -> Int -> Int 
pow x 0 = 1 
pow x e = x * (pow x (e-1)) 

無論哪種方式似乎對我來說是完全可行的,所以我想知道是否有這樣的標準。另外,假設它們在module中,它們從外部世界的可訪問性是否會影響其類型聲明的位置?

回答

16

最常見的樣式是將類型簽名直接放在函數的上面,而不管它是否被導出。

如果一切靠得很近,修改和更新函數會更容易。它還有助於在閱讀代碼時將類型簽名和功能組合在一起 - 這樣您就不必在文件的不同部分查找簽名或記住它。

您提出的替代方式會更好地獲取模塊摘要。令人高興的是,我們可以很容易的在GHCI的:browse命令做到這一點:

*Main> :browse Data.Function 
Data.Function.fix :: (a -> a) -> a 
Data.Function.on :: (b -> b -> c) -> (a -> b) -> a -> a -> c 
($) :: (a -> b) -> a -> b 
(.) :: (b -> c) -> (a -> b) -> a -> c 
const :: a -> b -> a 
flip :: (a -> b -> c) -> b -> a -> c 
id :: a -> a 

所以把所有的簽名上方的風格並不真的有很多可取之處,但沒有使用。