2017-04-23 9 views
0

へのデータレコードのリストを変換しようとするコードです:は、ハッシュマップここ

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は」おそらく近接していないことを知っています。私はいくつかの異なるアイデアを手に入れましたが、どれも解決しませんでした。

アイデア?より多くの情報が必要ですか?あなたがIOアクションの配列を決定するか、モナドのコードの他の種類を書いていないよう

おかげ

+1

あなたの署名は、私(呼び出し元)が 'k'と' v'の型を選ぶことを示しています。私は新しいタイプの 'Foo'と' Bar'を作り、 'Connections'のリストを' loadConn'に送ります。私は 'HashMap Foo Bar'を出したい。私にそれをしてくれますか?これは、 'loadConn'の型があまりにも一般的であることを示すはずです*。 – crockeea

答えて

1

はまず、doブロックは、場違いです。

あなたはハッシュマップは、値としてキーと接続プロパティなどの接続名を持つようにしたい場合は第二に、あなたの関数の型は(も質問に対する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パラメータ:mapに与えられる機能は、単一キーと値のペアに単一接続を変換すること

loadConn :: [Connections] -> HashMap String Object 
loadConn = H.fromList . map (\c -> (connectionName c, cfgProperty c)) 

注意。ちなみに、それぞれの値が単一の接続に見えるので、タイプの名前をConnectionsからConnectionに変更することをお勧めします。