型シグネチャを配置できる場所がいくつかあります。まず、addd には最も一般的な型があります (そして、最も一般的な型は (ほぼ常に) 署名を省略したときに GHC が推測するものです):
addd :: (Monad m, Num a) => a -> a -> m a
明示的な型シグネチャを指定することで、これを特定の型でのみ機能するように制限できます。これによりaddd
、引数がまったくポリモーフィックにならなくなります。たとえば、次のようになります。
addd :: Monad m => Int -> Int -> m Int
-- or,
addd :: Monad m => Integer -> Integer -> m Integer
または、 を呼び出すときに GHC に入力タイプを通知することもできますaddd
。たとえば、次のようになります。
d <- addd 4 (8 :: Integer)
型推論は、4
andd
が両方ともInteger
s であることを推論します。
最後に、タイプを指定できますd
。それを使用するとき (d
複数回使用する場合、必要な注釈は 1 つだけです)、次のようになります。
printf "%d" (d :: Integer)
または、それを設定するとき (GHC 拡張機能が必要ですScopedTypeVariables
):
{-# LANGUAGE ScopedTypeVariables #-}
[...]
add = do
(d :: Integer) <- addd 4 8