2009-11-26 20 views

Trả lời

19

Bạn nên sử dụng cú pháp kỷ lục trong hai tình huống:

  1. Loại có nhiều lĩnh vực
  2. Việc kê khai loại mang đến cho không có đầu mối về cách bố trí như dự kiến ​​

Ví dụ một loại điểm có thể đơn giản được khai báo là:

data Point = Point Int Int deriving (Show) 

Rõ ràng là lần đầu tiên trong t biểu thị tọa độ x và cột thứ hai là viết tắt của y. Nhưng trường hợp với việc kê khai loại sau đây là khác nhau (lấy từ Learn You a Haskell for Great Good):

data Person = Person String String Int Float String String deriving (Show) 

Cách bố trí loại dự định là: tên, họ cuối cùng, tuổi tác, chiều cao, số điện thoại, và hương vị kem yêu thích. Nhưng điều này không hiển nhiên trong tuyên bố trên. Cú pháp ghi có ích ở đây:

data Person = Person { firstName :: String 
        , lastName :: String 
        , age :: Int 
        , height :: Float 
        , phoneNumber :: String 
        , flavor :: String 
        } deriving (Show) 

Cú pháp ghi làm cho mã dễ đọc hơn và được lưu rất nhiều bằng cách tự động xác định tất cả các hàm truy cập cho chúng tôi!

+2

Bạn cũng có thể sử dụng cú pháp bản ghi thú vị trong đơn vị 'State', trong đó' runState' được sử dụng như một chút thông minh cú pháp. – jberryman

+1

Bạn có thể tận dụng hệ thống kiểu và sử dụng loại răng cưa như 'loại FirstName = Chuỗi loại LastName = Chuỗi loại Tuổi = Int loại Chiều cao = Float loại PhoneNumber = Chuỗi loại Flavor = Chuỗi dữ liệu Person = Person FirstName LastName Độ cao Tuổi PhoneNumber Flavor xuất hiện (hiển thị) ' Vì vậy, đối số của bạn không hợp lệ. – yaccz

6

Ngoài dữ liệu đa trường phức tạp, newtype s thường được xác định bằng cú pháp bản ghi. Trong một trong các trường hợp này, không có bất kỳ nhược điểm nào khi sử dụng cú pháp bản ghi, nhưng trong trường hợp các loại tổng hợp, các trình truy cập bản ghi thường không có ý nghĩa. Ví dụ:

data Either a b = Left { getLeft :: a } | Right { getRight :: b } 

là hợp lệ, nhưng các chức năng accessor là phần - đó là một lỗi để viết getLeft (Right "banana"). Vì lý do đó, những người truy cập như vậy thường không được khuyến khích; một cái gì đó như getLeft :: Either a b -> Maybe a sẽ phổ biến hơn và điều đó sẽ phải được xác định thủ công. Tuy nhiên, lưu ý rằng accessors có thể chia sẻ tên:

data Item = Food { description :: String, tastiness :: Integer } 
    | Wand { description :: String, magic :: Integer } 

Bây giờ description là tổng, mặc dù tastinessmagic cả vẫn là không.

Các vấn đề liên quan