2017-04-23 61 views
0

下面是代碼:試圖數據記錄列表轉換到一個HashMap

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 

OK,我知道「loadConn」恐怕還差得遠。我擺弄了一些不同的想法,但沒有一個能解決問題。

任何想法?是否需要更多信息?

感謝

+1

你的簽名表明我(調用者)可以爲'k'和'​​v'選擇類型。我將創建自己的新類型'Foo'和'Bar',然後將'Connections'列表發送到'loadConn'。我想要一個'HashMap Foo Bar'。你可以幫我嗎?這應該表明'loadConn'的類型是*太普通*。 – crockeea

回答

1

首先,做塊是出來的地方,因爲你不是測序IO行爲或寫任何其他種類的單子代碼。

其次,如果你想HashMap中有連接名稱作爲鍵和連接屬性值,你的函數的類型應該反映(這個問題也見crokeea的評論):

loadConn :: [Connections] -> HashMap String Object 

Thridly,建立一個列表的總體思路,你可以給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,因爲它的每個值似乎都是單個連接。