gpt4 book ai didi

haskell - haskell 中的运算符 <- 是如何表现的?

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

我(有点)了解 monad 并了解运算符 <- 将从 monad 中提取值。

但是它如何处理不同的类型呢?

通常,我看到它被用来从 IO monad 中提取字符串。但是在下面的示例代码中,我看不出为什么它在第 3 行主线失败,提示它期待一种 IO int 类型?编译器如何推断需要 IO int?

它 ( <- ) 在 multWithLog 中做了什么方法?

import Control.Monad.Trans.Writer.Lazy

main = do
putStrLn $ show $ logNumber 3 -- prints WriterT (Identity (3,["Got Number: 3"]))
putStrLn $ show $ multWithLog -- prints WriterT (Identity (3,["Got Number: 3"]))
_ <- logNumber 3 -- fails with Couldn't match type ‘WriterT [String] Data.Functor.Identity.Identity’ with ‘IO’
-- Expected type: IO Int
-- Actual type: Writer [String] Int
putStrLn "test"


logNumber :: Int -> Writer [String] Int
logNumber x = writer (x, ["Got Number: " ++ show x])

multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
--b <- logNumber 5
return a

最佳答案

do block 中的每个语句都必须来自相同的 monadic 类型。

multWithLog = do
a <- logNumber 3
return a

我们有 logNumber 3::Writer [String] Intreturn a::(Monad m) => m Int(这是多态的),所以整个thing 类型检查为 Writer [String] Int(m = Writer [String],这是一个 monad)。

main = do
putStrLn $ show $ logNumber 3
putStrLn $ show $ multWithLog
_ <- logNumber 3
putStrLn "test"

我们有 putStrLn ...::IO ()logNumber 3::Writer [String] Int。这是一个类型错误,因为 Writer [String]IO 不同。

根本原因是 do block 只是调用 >>=>> 的语法糖。例如。你的 main 真正的意思是

main =
(putStrLn $ show $ logNumber 3) >>
(putStrLn $ show $ multWithLog) >>
logNumber 3 >>= \_ ->
putStrLn "test"

(>>)  :: (Monad m) => m a -> m b -> m b
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

这要求 m 类型始终保持不变。

关于haskell - haskell 中的运算符 <- 是如何表现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52160092/

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