我相信您知道,在 Haskell 中,类型是推断的。换句话说,编译器会计算出你想要的类型。
但是,在 Haskell 中,也有多态类型类,其函数根据返回类型以不同的方式起作用。这是 Monad 类的示例,虽然我还没有定义所有内容:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
fail :: String -> m a
我们得到了很多只有类型签名的函数。我们的工作是为可以被视为 Monad 的不同类型进行实例声明,例如 Maybe t 或 [t]。
看看这段代码 - 它不会像我们预期的那样工作:
return 7
这是一个来自 Monad 类的函数,但是因为有多个 Monad,我们必须指定我们想要的返回值/类型,否则它会自动变成一个 IO Monad。所以:
return 7 :: Maybe Int
-- Will return...
Just 7
return 6 :: [Int]
-- Will return...
[6]
这是因为 [t] 和 Maybe 都已在 Monad 类型类中定义。
这是另一个例子,这次来自随机类型类。此代码抛出错误:
random (mkStdGen 100)
因为random 在Random 类中返回了一些东西,所以我们必须用StdGen 对象tupelo 来定义我们想要返回的类型:
random (mkStdGen 100) :: (Int, StdGen)
-- Returns...
(-3650871090684229393,693699796 2103410263)
random (mkStdGen 100) :: (Bool, StdGen)
-- Returns...
(True,4041414 40692)
这一切都可以在learn you a Haskell 在线找到,不过您必须阅读一些长篇。这一点,我几乎 100% 确定,这是唯一需要类型的时候。