从记录列表生成字典
Generate a dictionary from a list of Records
一个 BMap
对象是 BPair
Elm-Records 的列表。如何构建仅包含 BPair.isEnabled == True
的那些对的 Dict
ionary?最终,对于给定的 closer
.
,我们需要在相应的 opener
处 Dict.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
简而言之,您必须:
- 过滤
BMap
以获取 .isEnabled
中具有 True
的所有 BPair
- 将所有列表项转换为元组
EnabledPair
- 使用Dict.fromList将其转换为字典
- 现在您可以使用 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.Extra
的find
功能,更加简洁。为此感谢 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
一个 BMap
对象是 BPair
Elm-Records 的列表。如何构建仅包含 BPair.isEnabled == True
的那些对的 Dict
ionary?最终,对于给定的 closer
.
opener
处 Dict.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
简而言之,您必须:
- 过滤
BMap
以获取.isEnabled
中具有 - 将所有列表项转换为元组
EnabledPair
- 使用Dict.fromList将其转换为字典
- 现在您可以使用 Dict.get 检索
Maybe EnabledPair
True
的所有 BPair
请考虑这个例子:
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.Extra
的find
功能,更加简洁。为此感谢 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