从记录列表生成字典

时间:2016-05-02 20:35:25

标签: dictionary record elm

Dict对象是BPair.isEnabled == True榆树记录的列表。如何构建仅包含Dict.get对的opener离子?最终,对于给定的closer,我们需要type alias EnabledPair = (Char, Char) type alias EnabledMap = Dict EnabledPair -- how to generate this? type alias BPair = { opener: Char, closer: Char, isEnabled: Bool, id: Int } type alias BMap = List BPair 对应{{1}}。

或者,如果记录本身可以被查询,那么我宁愿那样做。

{{1}}

3 个答案:

答案 0 :(得分:3)

简而言之,你必须:

  1. 过滤BMap以获取BPair中所有True .isEnabled
  2. 将所有列表项转换为元组EnabledPair
  3. 使用Dict.fromList将其转换为字典
  4. 现在,您可以使用Dict.get来检索Maybe EnabledPair
  5. 请考虑这个例子:

    import Graphics.Element exposing (show)
    import Dict exposing (Dict)
    
    
    type alias EnabledPair = (Char, Char) 
    
    
    type alias EnabledMap = Dict Char EnabledPair
    
    
    type alias BPair = {
      opener: Char, 
      closer: Char,
      isEnabled: Bool,
      id: Int
    }
    
    
    type alias BMap = List BPair
    
    
    testList : BMap
    testList =
      [ BPair '(' ')' True 1
      , BPair '{' '}' False 2
      , BPair '[' ']' True 3
      , BPair '<' '>' False 4
      ]
    
    
    main =
      testList
      |> List.filter (\{isEnabled} -> isEnabled == True)
      |> List.map (\{opener, closer} -> (opener, closer))
      |> Dict.fromList
       -- Dict.get will always return Maybe Char, so you have to handle that
      |> Dict.get '{'
      |> show
    

答案 1 :(得分:1)

此版本使用List.Extra的{​​{1}}功能来更简洁地执行此操作。感谢Nick H

find

答案 2 :(得分:0)

与接受的答案形成鲜明对比,这是一种避免完全生成字典的方法。

matchEnabledOpenr: Char -> BPair -> Maybe Char
matchEnabledOpenr o bp = 
  case bp.isEnabled of
    True -> 
      if bp.opener == o then 
        Just bp.closer 
      else 
        Nothing 
    False -> 
        Nothing

getClosr: Char -> List BPair -> Maybe Char 
getClosr o bm =  
  List.head (List.filterMap (matchEnabledOpenr o) bm )