gpt4 book ai didi

haskell - 编写一个从 IO a -> a? 的函数

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

采用函数getLine - 它的类型为:

getLine :: IO String

如何从此 IO 操作中提取 String

<小时/>

更一般地说,我如何转换它:

IO a

对此:

a

如果这是不可能的,那么为什么我不能这样做?

最佳答案

在 Haskell 中,当您想要使用“捕获”在 IO 中的值时,您不会从 IO 中取出值。相反,您将要执行的操作放入 IO ,还有!

例如,假设您要检查 getLine :: IO String 有多少个字符将使用 length 生成Prelude 中的函数。

存在一个名为 fmap 的辅助函数当专门化为 IO 时, ,具有类型:

fmap :: (a -> b) -> IO a -> IO b

它需要一个适用于未陷入 IO 中的“纯”值的函数。 ,并为您提供一个可处理 IO 中捕获的值的函数。 。这意味着代码

fmap length getLine :: IO Int

代表IO从控制台读取一行然后给出其长度的操作。

<$>fmap 的中缀同义词这可以让事情变得更简单。这相当于上面的代码:

length <$> getLine

现在,有时您想要使用 IO 执行操作- 捕获值本身返回 IO - 被困值。简单的例子:您想使用 putStrLn :: String -> IO () 写回刚刚读取的字符串。 .

在这种情况下,fmap是不足够的。您需要使用 (>>=) 运算符,当专门用于 IO 时,类型为IO a -> (a -> IO b) -> IO b 。在这种情况下:

getLine >>= putStrLn :: IO ()

使用(>>=)上链IO行动具有命令式、连续性的味道。有一种语法糖叫 "do-notation"这有助于以更自然的方式编写这样的顺序操作:

do line <- getLine
putStrLn line

请注意 <-这里不是一个运算符,而是 do 表示法提供的部分语法糖。

关于haskell - 编写一个从 IO a -> a? 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42469244/

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