gpt4 book ai didi

haskell - 如何在 Haskell 中使用来自不同类型 monad 的值

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

老实说,我觉得这一定是在某个地方被骗了,但我找不到 it even after searching .

假设我有以下代码来简单地从用户那里读取一个 double 值并将其回显:

import qualified Control.Monad.Except as E
import Text.Read(readMaybe)

data Error = ParseError String
| Default String deriving (Show)

type ThrowsError = Either Error

main = do
putStrLn "Enter your number: "
val <- getDouble
print val

parseString :: String -> ThrowsError Double
parseString val = maybe (E.throwError $ ParseError val) return
(readMaybe val :: Maybe Double)

getDouble :: ThrowsError Double
getDouble = getLine >>= parseString

这在两个地方中断:

  1. main 中,putStrLn 是类型 IO DoublegetDouble 是类型 ThrowsError双

  2. getDouble 中,getLine 是类型 IO DoubleparseString 返回 IO Double

本质上,我希望能够从 IO monad 中提取值,对其应用计算,然后将其放回适当的 monad 中。但是,绑定(bind)函数似乎期望输入和输出使用相同的 monad 类型,所以我想做的是行不通的。

有什么解决办法?

最佳答案

您不需要任何变压器。 parseString是一个纯函数,所以要将它应用到你使用的 monadic Action fmap (又名 (<$>) ),而不是 (>>=)就像你一样。

getDouble :: IO (ThrowsError Double)
getDouble = parseString <$> getLine

您将使用 (>>=)如果parseString返回了 IO something .

关于haskell - 如何在 Haskell 中使用来自不同类型 monad 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62688432/

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