尝试将数据记录列表转换为hashmap

时间:2017-04-23 23:49:36

标签: haskell

以下是代码:

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”可能甚至没有关闭。我已经摆弄了一些不同的想法,但没有一个能够成功。

有什么想法吗?是否需要更多信息?

由于

1 个答案:

答案 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,因为其每个值似乎都等于一个连接。