Tôi muốn tạo một số kiểu dữ liệu không tương thích, nhưng bằng nhau. Đó là, tôi muốn có một kiểu tham số Foo a
, và các chức năng nhưTôi có đang suy nghĩ và sử dụng các loại singleton trong Haskell đúng không?
bar :: (Foo a) -> (Foo a) -> (Foo a)
mà không thực sự quan tâm về những gìa
là. Để làm rõ hơn nữa, tôi muốn hệ thống loại để ngăn chặn tôi từ làm
x :: Foo Int
y :: Foo Char
bar x y
trong khi tôi cùng một lúc không thực sự quan tâm đến Int
và Char
(Tôi chỉ quan tâm rằng họ đang không giống nhau) .
Trong mã thực tế của tôi, tôi có loại cho đa thức trên một vòng nhất định. Tôi không thực sự quan tâm những gì không xác định được, miễn là hệ thống kiểu dừng tôi thêm một đa thức trong t với một đa thức trong s. Cho đến nay tôi đã giải quyết điều này bằng cách tạo ra một typeclass Indeterminate
, và parameterizing loại đa thức của tôi như
data (Ring a, Indeterminate b) => Polynomial a b
Cách tiếp cận này cảm thấy hoàn toàn tự nhiên cho phần Ring
vì tôi làm chăm sóc về mà đặc biệt là vòng một đa thức nhất định là hơn . Nó cảm thấy rất phấn khởi cho phần Indeterminate
, như được mô tả chi tiết bên dưới.
Cách tiếp cận ở trên hoạt động tốt, nhưng cảm thấy bị giả tạo. Đặc biệt là phần này:
class Indeterminate a where
indeterminate :: a
data T = T
instance Indeterminate T where
indeterminate = T
data S = S
instance Indeterminate S where
indeterminate = S
(và cứ như vậy có thể thêm một vài xác định). Nó cảm thấy lạ và sai. Về cơ bản, tôi đang cố gắng yêu cầu các trường hợp của Indeterminate
là những người độc thân (trong this sense). Cảm giác kỳ quặc là một dấu hiệu cho thấy tôi có thể tấn công sai lầm này. Khác là một thực tế là tôi cuối cùng phải chú thích rất nhiều của tôi Polynomial a b
s kể từ khi loại thực tế b
thường không thể suy ra (đó là không lạ, nhưng là gây phiền nhiễu tuy nhiên).
Mọi đề xuất? Tôi có nên tiếp tục làm như thế này không, hay tôi đang thiếu cái gì đó?
PS: Đừng cảm thấy bị xúc phạm nếu tôi không upvote hoặc chấp nhận câu trả lời ngay lập tức. Tôi sẽ không thể kiểm tra lại sau vài ngày.
Có lý do chính đáng để không mô hình hóa đa thức như chuỗi các phần tử của vòng hay thứ gì đó tương tự (chuỗi các khoản tiền một phần chẳng hạn)? –
Ok, tôi hơi lạc lõng ở đây. Tôi không hiểu tại sao bạn cần 'Vô định'. Nếu bạn chỉ muốn thực thi rằng hai bs là như nhau, hãy để nó trong chữ ký loại, và đó là điều đó? – sclv
@ Alexandre C .: Tôi đang làm điều đó. Nhưng tôi muốn chữ ký loại để làm cho nó vô nghĩa, nói, thêm "2 + 5t" đến "6s". Với đa thức là chuỗi các phần tử vòng, hệ thống kiểu (đúng) ngăn tôi thêm một đa thức với các hệ số trong một vòng với một hệ số với một hệ số khác, nhưng nó không phân biệt trên không xác định. Bây giờ, tất nhiên, có hay không tôi thực sự cần indeterminates là một câu hỏi rất hợp lệ :-) – gspr