[英]Processing IO values in haskell
我在Haskell寫一個帶有IO動作的小程序
module StackQuestion where
import Data.Map (Map, insert, fromList)
type Name = String
type Value = String
readValue :: Name -> IO String
readValue name = do putStrLn name
value <- getLine
return value
addPair :: Name -> Value -> Map Name Value -> Map Name Value
addPair = insert
names = map show [1..5]
values = map (\char -> [char]) ['a'..'d']
initialMap = fromList (zip names values)
正如你所看到的,我有一些帶有值的初始映射,以及為映射添加一對的函數,這些函數讀取一個值。
如何從readValue
獲取一個明確的String
值並將其傳遞給另一個函數?
或者我應該更改type Value = String
以type Value = IO String
並使用map Map String (IO String)
?
如果我有Map String (IO String)
我如何處理這個地圖,我怎么能得到任何依賴於IO
containter中的數據的值(可能是一些函數func :: (a->b) -> IO a -> b
)例如,有沒有辦法比較IO String
和clear String
?
如果我有功能func
我會寫的
map :: Map String (IO String)
...
func (==) (map ! "key")
使用IO
值的策略是什么?
如何從
readValue
獲取一個明確的String
值並將其傳遞給另一個函數?
你不能; 你必須在IO
monad中操縱readValue
的結果。
{- read value for name and store both in map -}
readAndStore :: Name -> Map Name Value -> IO (Map Name Value)
readAndStore name m = do value <- readValue name
return $ insert name value m
return
函數獲取insert
的結果並將其整齊地放回IO
monad中。 此代碼舉例說明了使用IO
普通函數操作值的一般模式。
或者我應該更改
type Value = String
以type Value = IO String
沒有; 考慮一下這意味着什么。 IO String
表示具有可能的帶有String
結果的副作用( IO
)的計算。 您將名稱映射到計算。 (這是可能的,但這不是你的意思。)
我上面顯示的示例使用IO (Map Name Value)
代替; 即,具有Map
-typed結果的IO
monad中的計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.