Я пробовал написать простую функцию, которая берет любой тип (возможно, параметризуемый двумя разными типами) и делает одну вещь, если она получает Left и другую вещь, если она становится правой. следующий код,Можно ли использовать для своего рода простой полиморфизм?
someFunc :: (Show a, Show b) => Either a b -> IO()
someFunc (Left x) = print $ "Left " ++ show x
someFunc (Right x) = print $ "Right " ++ show x
main = do
someFunc (Left "Test1")
someFunc (Right "Test2")
Однако, это дает,
Ambiguous type variable `b0' in the constraint:
(Show b0) arising from a use of `someFunc'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' expression: someFunc (Left "Test1")
и
Ambiguous type variable `a0' in the constraint:
(Show a0) arising from a use of `someFunc'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: someFunc (Right "Test2")
Если я правильно понимаю, когда я вызываю функцию с Left x
, он жалуется, потому что это Безразлично Не знаю тип варианта Right x
и наоборот. Однако эта ветвь функции не используется. Есть лучший способ сделать это?
На вопрос, цель использования «Либо» должна была получить форму ** полиморфизма **. Альтернатива boolean-tag, которую вы предоставляете, не делает этого. Выбор между «Left» и «Right» также должен выбирать между двумя типами. –
@sacundim: Ну, шаблоны вызова моего 'someFunc' идентичны' someFunc' в вопросе. Независимо от того, в чем заключалось намерение, мое определение * - это то, что было достигнуто; если то, что есть, не то, что нужно, то это также указывает на проблему в оригинальном решении :) – ehird