Можно ли использовать конструкторы сопоставления с шаблоном для параметра с ограничениями класса типа?

См. Пример кода ниже. Он не компилируется. Я думал, что, возможно, это потому, что у него должен быть единственный тип для первого параметра в тестовой функции. Но это не так Это имеет смысл, потому что, если я не сопоставлю его с образцом, чтобы он скомпилировался, я могу вызвать его с помощью 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.
14
задан mentics 22 April 2011 в 17:52
поделиться