簡體   English   中英

在haskell中處理IO值

[英]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 = Stringtype Value = IO String並使用map Map String (IO String)

如果我有Map String (IO String)我如何處理這個地圖,我怎么能得到任何依賴於IO containter中的數據的值(可能是一些函數func :: (a->b) -> IO a -> b )例如,有沒有辦法比較IO Stringclear 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 = Stringtype Value = IO String

沒有; 考慮一下這意味着什么。 IO String表示具有可能的帶有String結果的副作用( IO )的計算。 您將名稱映射到計算。 (這是可能的,但這不是你的意思。)

我上面顯示的示例使用IO (Map Name Value)代替; 即,具有Map -typed結果的IO monad中的計算。

暫無
暫無

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

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