次の場合にジェネリック型を返す関数を haskell で作成することは可能ですか。
- この関数の本体では、結果として 2 つの別々のタイプを出力します
A
(B
いくつかの計算に基づく) - タイプ
A
とB
共通点がありますtype class
C
サンプルコードを見てみましょう。型チェッカーは、このコードが正しいことを確認できる必要があります。関数はortest
型のインスタンスを出力するため、結果に対して実行できます。A
B
f
data A = A
data B = B
class C a where
f :: a -> Int
instance C A where
f x = 2
instance C B where
f x = 3
-- This function fails to compile:
-- I want something like:
-- test :: C a => Int -> a
test x = if x < 1
then A
else B
main = do
print $ f $ test 0
print $ f $ test 1
これがアンチパターンか何かのように見えることはわかっていますが、私は Haskell の機能をテストするのが大好きなので、特に型システムに関しては、その答えを知りたいと思っています。