どちらかの型(おそらく2つの異なる型によってパラメータ化されています)をとり、Rightを取得する場合は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")
しかし、これは私がLeft x
で関数を呼び出すとき、それはdoesnのため、それが不平を言っている、
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")
を与えますRight x
の種類を知りません。またその逆もあります。ただし、この関数の分岐は使用されません。これを行うより良い方法はありますか?
質問によれば、「どちらか」の使用の意図は**多形性**の形を得ることでした。あなたが提供しているboolean-tagの代替手段はそれをしません。 「左」と「右」の選択肢も、2つのタイプの中から選択することになっています。 –
@サクンチム:私の 'someFunc'の呼び出しパターンは、質問の' someFunc'と同じです。意図が何であっても、私の定義は達成されたものです。それが何が望ましいのではない場合、それは元のソリューションの問題も指摘しています:) – ehird