簡體   English   中英

在Haskell中連接String和IO Integer

[英]Concatenate String and IO Integer in Haskell

我編寫了一個函數,將當前屏幕寬度作為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 ? ...

我想將魔術函數傳遞給一個字符串,比如“Screen Width:”,我希望它添加當前的屏幕寬度,這樣我就可以得到“Screen Width: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 "Screen Width" getScreenWidth ...但要注意! 如果您這樣做:

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

...然后getScreenWidth將執行兩次...對於這個特定的操作,這不太可能是一個問題,但如果它是一個從文件或數據庫或網站讀取整數的操作,你可以看到執行兩次可能是不受歡迎的。

通常最好不要編寫像labelIOInteger這樣的labelIOInteger ,而是這樣做:

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

...因此,如果您發現自己需要將返回值用於兩個不同的計算,則可以輕松地對此進行重構:

screenWidth <- getScreenWidth
let widthLabel = labelInteger "Screen Width" screenWidth
isPortrait <- liftM (screenWidth <) getScreenHeight
magic_function :: IO Integer -> String -> IO String
magic_function num msg = do
                            n <- num
                            return (msg ++ (show n))

建議的副本實際上給你所需要的答案,但我想,如果這是顯而易見的,你怎么也不會首先會問這個。 :]

通常,您不能直接使用類型為IO something的值執行任何操作。 這種類型不表示的類型的值something包裹在IO ,而是一個過程可能使用IO產生的類型的值something被執行時。 畢竟,如果你不止一次使用IO something值,它可能會有所不同。

所以在你的情況下,你不能簡單地連接String ; 你必須定義一個執行另一個IO程序的新IO程序,然后連接它產生的值。 一般表格看起來像這樣:

someFunction :: a -> b -> c
someFunction a b = ...

someProcedure :: IO a -> b -> IO c
someProcedure a b = do aValue <- a -- this executes "a"
                       return $ someFunction aValue b

有更短的方法來編寫它,但我認為這有助於拼寫出來。 具體取決於你實際在做什么,當然 - 對於你的程序,你可以使用show將整數轉換為String ,然后像往常一樣連接字符串。

我想你想要這個:

magic :: IO Integer -> String -> IO String
magic ios s =
  do i <- ios
     return $ s ++ ": " ++ (show i)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM