8

Tôi đã viết mô-đun Vector toán học trong Haskell.Đặt tên bí danh kiểu dữ liệu Haskell

Vì vậy, tôi bắt đầu với:

data Vector a = Vector !a !a !a deriving (Eq, Show) 

Fine-này cho phép tôi sử dụng bất kỳ loại dữ liệu số tôi muốn. Vấn đề là tôi không muốn viết DoubleVector Double ở khắp mọi nơi vì một lý do đơn giản mà tôi không cần phải làm. Vì vậy, tôi thêm:

type Scalar = Double 
type Vector = Vector Scalar 

Nhưng tất nhiên dòng thứ hai là sai, vì bây giờ có hai khai báo là Vector. Vậy tôi nên đổi nó thành gì? Tôi nghĩ với bản thân mình, không, tôi sẽ viết này trên tất cả các mã của tôi, vì vậy tôi muốn để lại bí danh loại chỉ đơn giản là Vector. Điều đó có nghĩa là tôi phải thay đổi tên kiểu dữ liệu. Nhưng nếu tôi thay đổi điều đó, thì tôi cảm thấy tôi cũng nên thay đổi nhà xây dựng, điều này khiến mọi thứ trở nên khó hiểu hơn. Nhưng nếu nó cảm thấy khó xử khi làm cho hàm tạo có cùng tên với bí danh kiểu theo cách này.

Ngay bây giờ tôi có điều này:

type Scalar = Double 
type Vector = VectorT Scalar 

data VectorT a = Vector !a !a !a deriving (Eq, Show) 

tôi nhặt T tùy tiện (tôi đoán nó là viết tắt của "loại") nhưng tôi không như vậy chắc chắn về điều này. Thông thường khi tôi tài liệu chức năng tôi sẽ nói -- Calculate the magnitude of a Vector, nhưng với VectorT Tôi cảm thấy như tôi thực sự nên sử dụng rằng tên loại. Vì vậy, tôi nghỉ mát để chỉ đề cập đến họ là vectors (không viết hoa) - ngoại trừ sau đó tôi cảm thấy như tôi phải áp dụng quy ước này cho mọi nhận xét cho mọi loại dữ liệu.

Có ai ở trong tình huống tương tự không? Bất cứ ai có thể nghĩ ra một giải pháp thanh lịch hơn trong trường hợp này?

+0

Tôi đã thấy điều này trong một vài trường hợp, đặc biệt là gói 'language-c' sử dụng phương pháp này để xác định biểu diễn cây cú pháp của nó. Nếu bạn chưa bao giờ gặp phải phong cách trước khi nó có thể cảm thấy một chút khó xử, nhưng tôi hy vọng rằng mọi người quen với nó rất nhanh chóng. –

+6

Chỉ có hai điều khó khăn trong Khoa học Máy tính: làm mất hiệu lực bộ nhớ cache và đặt tên cho mọi thứ. - Phil Karlton –

+2

Có thể 'VectorOf Double' nếu bạn không thích' VectorT'. – kennytm

Trả lời

8

Một giải pháp cho vấn đề cụ thể của bạn sẽ là có loại dữ liệu trong một mô-đun khác từ loại từ đồng nghĩa. Tức là, có một mô-đun Math.Vector có chứa khai báo dữ liệu và một số hàm chung chung (có nghĩa là, các hàm hoạt động với tất cả các kiểu số). Sau đó, khi bạn thực sự sử dụng Vector Double trong mã của bạn rất nhiều, chỉ cần tạo kiểu từ đồng nghĩa sử dụng nhập trình độ:

import qualified Math.Vector as MV 

type Scalar = Double 
type Vector = MV.Vector Scalar 

Tôi nghĩ rằng đây có ý nghĩa từ một quan điểm tổ chức mã. Đặc biệt, nếu bạn đã xác định loại Vector của mình để hoạt động trên tất cả các loại số, tôi mong các hàm trong mô-đun đó cũng hoạt động trên tất cả các loại số. Thực tế là bạn sử dụng Vector Double rất nhiều trong một số phần khác của mã không nên ảnh hưởng đến mô-đun trong đó Vector thực sự được xác định. Sau khi tất cả, nó hoàn toàn hợp lý để tưởng tượng sử dụng Vector Int rất nhiều trong một phần khác của chương trình của bạn.

Là một sang một bên, tôi không chắc chắn gọi nó là Vector là ý tưởng tốt nhất. Một vector không nhất thiết phải có ba chiều, vì vậy tôi sẽ gọi kiểu dữ liệu của bạn giống như Vector3D. Đây thực sự là tên được sử dụng trong một số API khác (như API Java 3D), vì vậy đây có thể là một lựa chọn tốt.

2

Có bất kỳ lý do cụ thể để không chỉ làm

data Vector = Vector !Double !Double !Double deriving (Eq, Show) 

Đó có vẻ như ý tưởng đơn giản nhất để tôi ...

+0

Điều này cũng có ưu điểm là '{- # UNPACK # -}'. – FunctorSalad

+0

Sau đó, tôi không thể làm cho nó một ví dụ của 'Functor' và' Applicative'. – mk12

+0

Và nó rất hữu ích để có thể 'fmap' bất cứ thứ gì trên một véc tơ — nếu không có gì khác, nó làm cho việc triển khai mô đun trở nên đẹp hơn. – mk12

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