以下是代码:
import Data.HashMap.Lazy as H
data Connections = Connections { connectionName :: String
, cfgProperty :: !Object
} deriving (Show, Generic)
loadConn :: [Connections] -> HashMap k v
loadConn c = H.fromList $ j c
where j cn = do
let h = foldl (\l -> [(connectionName l, cfgProperty l)]) cn
return h
好的,我知道“loadConn”可能甚至没有关闭。我已经摆弄了一些不同的想法,但没有一个能够成功。
有什么想法吗?是否需要更多信息?
由于
答案 0 :(得分:1)
首先,do-block不合适,因为您没有对IO
行为进行排序或编写任何其他类型的monadic代码。
其次,如果您希望hashmap将连接名称作为键,连接属性作为值,则函数的类型应该反映出来(请参阅crokeea对该问题的评论):
loadConn :: [Connections] -> HashMap String Object
很明显,构建一个可以提供给H.fromList
的列表的一般想法是合理的,但是你需要map
而不是折叠:
loadConn :: [Connections] -> HashMap String Object
loadConn cs = H.fromList $ map (\c -> (connectionName c, cfgProperty l)) cs
或者,使用.
进行功能组合而不提及cs
参数:
loadConn :: [Connections] -> HashMap String Object
loadConn = H.fromList . map (\c -> (connectionName c, cfgProperty c))
请注意,赋予map
的函数会将单个连接转换为单个键值对。顺便说一下,您可能希望将类型名称从Connections
更改为Connection
,因为其每个值似乎都等于一个连接。