从记录列表生成字典

Generate a dictionary from a list of Records

一个 BMap 对象是 BPair Elm-Records 的列表。如何构建仅包含 BPair.isEnabled == True 的那些对的 Dictionary?最终,对于给定的 closer.

,我们需要在相应的 openerDict.get

或者,如果记录本身可以是 'queried',那么我宁愿这样做。

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. 过滤 BMap 以获取 .isEnabled
  2. 中具有 True 的所有 BPair
  3. 将所有列表项转换为元组 EnabledPair
  4. 使用Dict.fromList将其转换为字典
  5. 现在您可以使用 Dict.get 检索 Maybe EnabledPair

请考虑这个例子:

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

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

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 )

这个版本使用了List.Extrafind功能,更加简洁。为此感谢 Nick H

import List.Extra as ListX

matchEnabledOpenr: Char -> BPair -> Bool
matchEnabledOpenr o bp =
  bp.isEnabled && bp.opener == o


getClosr: Char -> List BPair -> Maybe Char
getClosr o bmap =
  ListX.find (matchEnabledOpenr o) bmap
    |> Maybe.map .closer