См. пример кода ниже. Он не будет компилироваться. Я подумал, что, возможно, это потому, что для первого параметра в тестовой функции он должен иметь один тип. Но это не имеет смысла, потому что если я не сопоставляю ему шаблон, поэтому он будет компилироваться, я могу назвать его как с MyObj11 5
, так и MyObj21 5
, которые представляют собой два разных типа.
Итак, что же ограничивает, поэтому вы не можете сопоставлять шаблон конструкторам с параметром ограничения класса класса? Или есть какой-то механизм, с помощью которого вы можете?
class SomeClass a where toString :: a -> String
instance SomeClass MyType1 where toString v = "MyType1"
instance SomeClass MyType2 where toString v = "MyType2"
data MyType1 = MyObj11 Int | MyObj12 Int Int
data MyType2 = MyObj21 Int | MyObj22 Int Int
test :: SomeClass a => a -> String
test (MyObj11 x) = "11"
test (MyObj12 x y) = "12" -- Error here if remove 3rd line: rigid type bound error
test (MyObj22 x y) = "22" -- Error here about not match MyType1.