gpt4 book ai didi

haskell - 在一元上下文中使用 Data.Map

转载 作者:行者123 更新时间:2023-12-02 10:56:52 29 4
gpt4 key购买 nike

我正在操作的 map 具有单键(IO Double 类型)。我需要在这张 map 上使用 findMax 。我可以使用 liftM 来实现此目的吗?

Map.findMax $ Map.fromList [(f x, "X"), (f y, "Y"), (f z, "Z")]

此处 f x 的类型为 IO Double

最佳答案

拥有IO确实没有意义。 - 输入值作为映射中的键。 IO t 类型的值对于某些类型 t可以被认为是一个产生 t 类型值的“程序”每次运行时:您可以运行多次,每次都可能产生不同的值。

所以,你可能想要的是首先运行“程序”以获得一些结果;这些结果可以成为您 map 的键。

例如,如果您有一个“程序”

f :: Int -> IO Int

它接受整数并计算(可能有效)整数,并且您需要运行 [1 .. 10] 的输入要获取 map 的 key ,您可以按照以下步骤操作:

createMap :: IO (Map Int Int)
createMap = do
keys <- mapM f [1 .. 10]
return $ foldr (\k -> Map.insert k (g k)) Map.empty keys

这假设值是通过函数根据键计算的

g :: Int -> Int

createMap生成从整数到整数的映射;它在 IO 中返回它-monad,因为使用哪些键来填充 map 可能会受到“程序”f所处的环境的影响。已运行。

你的问题

在您的情况下,这意味着您想要计算的最大值必须在 IO 中生成-monad 以及:

getMax :: Int -> Int -> Int -> IO (Double, String)
getMax x y z = do
keys <- mapM f [x, y, z]
let entries = zip keys ["X", "Y", "Z"]
return (Map.findMax (Map.fromList entries))

增量构建 map

map 当然不需要一次性创建,也可以增量构建:

f :: Int -> IO Int
f = ...

g :: Int -> Int
g = ...

createMap :: IO (Map Int Int)
createMap = do
-- create the empty map
let m0 = Map.empty

-- insert an entry into the map
k1 <- f 1
let m1 = Map.insert k1 (g k1) m0

-- extend the map with another entry
k2 <- f 2
let m2 = Map.insert k2 (g k2) m1

-- return the map
return m2

关于haskell - 在一元上下文中使用 Data.Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575317/

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