gpt4 book ai didi

Haskell:对 `>>=` 运算符的类型感到困惑

转载 作者:行者123 更新时间:2023-12-01 06:57:05 24 4
gpt4 key购买 nike

我正在学习一些介绍性的 Haskell Material ,目前正在学习 Monads。我从概念上理解 >>=运算符的类型:
(Monad m) => m a -> (a -> m b) -> m b .

在这种情况下,我很困惑为什么以下代码有效,即为什么它不会导致类型不匹配:

main = getLine >>= \xs -> putStrLn xs

因为我们知道 getLine :: IO String ,我假设它可以与 String -> IO String 类型的函数“绑定(bind)” .然而 putStrLn属于不同类型: putStrLn :: String -> IO () .

那么为什么 Haskell 允许我们使用 >>=有这两个功能吗?

最佳答案

让我们排列类型:

(>>=)    ::  m      a -> (     a ->  m  b) -> m b
getLine :: IO String
putStrLn :: (String -> IO ())

这里有 m = IO , a = String , 和 b = () , 所以我们可以将这些替换为 >>=的类型签名以获得最终的类型签名
(>>=) :: IO String -> (String -> IO ()) -> IO ()

关于Haskell:对 `>>=` 运算符的类型感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26365770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com