gpt4 book ai didi

haskell - <|> 的替代 IO 错误

转载 作者:行者123 更新时间:2023-12-02 17:43:12 25 4
gpt4 key购买 nike

我正在使用运算符<|>用于:

import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit (simpleHttp)
import Data.Aeson
import Data.Maybe

data FooBar = FooBar {
name :: !Text,
surname :: !Text
} deriving (Show,Generic)

instance FromJSON FooBar
instance ToJSON FooBar

getFeed :: String -> String -> IO (FooBar)
getFeed foo bar = decode <$> (B.readFile foo <|> simpleHttp bar)

但是当我尝试编译它时,我得到:

No instance for (Alternative IO) arising from a use of ‘<|>’
In the second argument of ‘(<$>)’, namely
‘(B.readFile foo <|> simpleHttp bar)’
In the expression:
decode <$> (B.readFile foo <|> simpleHttp bar)
In an equation for ‘getFeed’:
getFeed env id
= decode <$> (B.readFile foo <|> simpleHttp bar)

这个错误对我来说有点晦涩难懂。知道如何解决这个问题吗?(顺便说一句,从这个回复中得到了一些见解:Confused by the meaning of the 'Alternative' type class and its relationship to other type classes)

最佳答案

除了您的实际问题之外,这就是 IO 不能成为替代方案的原因。

首先,你会为 empty 做什么? ?其类型需要为 forall a. IO a - 返回任何类型值的 IO 操作!

第二,如何定义失败(用于 <|> )?对于诸如Maybe之类的类型,空是显而易见的( Nothing ),失败可以定义为 Nothing以及。因此,如果第一个参数为 Nothing,则返回第二个参数。但是IO呢?单子(monad)上失败的(令人困惑的)概念很神奇,并且没有在类型级别上表示,换句话说,没有明确的失败值。

如果您将所有 IO 操作封装在 Maybe 中,它可以工作。 (或 Either ),例如 readFile' :: FilePath -> IO (Maybe String) 。然后通过提升<|>你可以结合行动。您必须捕获失败(异常)并将其转换为 Nothing在你的包装中。

(为了方便起见,可以为所有 Alternative 创建 Alternative f, Monad m => m f 的实例,但这需要类型组合?我不确定)

关于haskell - <|> 的替代 IO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31261905/

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