有几个地方可以放置类型签名。首先, 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
并且d
都是Integer
s。
最后,你可以给出d
一个类型。要么当你使用它(如果你d
多次使用,你只需要一个注解),像这样:
printf "%d" (d :: Integer)
或者当你设置它时(需要 GHC 扩展ScopedTypeVariables
):
{-# LANGUAGE ScopedTypeVariables #-}
[...]
add = do
(d :: Integer) <- addd 4 8