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}}
答案 0 :(得分:3)
简而言之,你必须:
BMap
以获取BPair
中所有True
.isEnabled
EnabledPair
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
答案 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 )