gpt4 book ai didi

string - Haskell 中连接字符串和 IO 整数

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

我编写了一个函数,将当前屏幕宽度返回为 IO Integer(到目前为止有效)。

getScreenWidth:: IO Integer
getScreenWidth = do
(sx, sy, w, h) <- getScreenDim 0
return $ sx

现在我想将屏幕宽度添加到字符串中:

> magic_function :: IO Integer -> String -> ... magic output type
> magic_function = ... ? this is where i am stack at ? ...

我想将魔术函数传递给一个字符串,例如“屏幕宽度:”,我希望它添加当前屏幕宽度,以便我得到“屏幕宽度:1680”。如何连接 IO 整数和普通字符串?它可以与show一起使用吗?

有人可以帮我吗?

最佳答案

首先,忘记 IO:

labelInteger :: String -> Integer -> String
labelInteger label number = label ++ ": " ++ show number

现在担心 IO:

import Control.Monad (liftM, liftM2)

labelIOInteger :: String -> IO Integer -> IO String
labelIOInteger label ioNumber = liftM (labelInteger label) ioNumber

用作例如labelIOInteger“屏幕宽度”getScreenWidth...但要小心!如果你这样做:

widthLabel <- labelIOInteger "Screen width" getScreenWidth
isPortrait <- liftM2 (<) getScreenWidth getScreenHeight

...然后 getScreenWidth 将被执行两次...诚然,对于这个特定的操作来说这不太可能是一个问题,但如果它是一个从文件或文件中读取整数的操作数据库或网站,您可以看到执行两次可能是不可取的。

通常最好不要编写像 labelIOInteger 这样的函数,而是这样做:

widthLabel <- liftM (labelInteger "Screen Width") getScreenWidth

...这样,如果您发现自己需要使用返回值进行两个不同的计算,您可以轻松重构:

screenWidth <- getScreenWidth
let widthLabel = labelInteger "Screen Width" screenWidth
isPortrait <- liftM (screenWidth <) getScreenHeight

关于string - Haskell 中连接字符串和 IO 整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197285/

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