考虑二叉树的以下定义:
data Tree a = Nil | Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)
该Foldable实例可以被定义为如下:
instance Foldable Tree where
foldr _ z Nil = z
foldr f z (Node l d r) = foldr f (f d (foldr f z l)) r
Run Code Online (Sandbox Code Playgroud)
但问题是elem函数运行O(n)而不是O(log n).当我尝试实现自定义时elem:
elem x Nil = False
elem x (Node l d r)
| x == d = True
| x < d = elem x l
| otherwise …Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下内容的JSON Blob:
[
{
"version": 1
},
{
"version": "3"
},
...
]
Run Code Online (Sandbox Code Playgroud)
请注意,有些版本是数字,有些是字符串。我想获取版本列表。我可以使用以下镜头组合来提取数字版本:
v1 :: [String]
v1 = obj ^.. AL.values . AL.key fieldName . AL._Number . to show
Run Code Online (Sandbox Code Playgroud)
然后下面提取字符串
v2 :: [String]
v2 = obj ^.. AL.values . AL.key fieldName . AL._String . to T.unpack
Run Code Online (Sandbox Code Playgroud)
但是,如何通过一次遍历列表来获得版本列表?是否有任何镜头组合器需要镜头AL._Number . to show并AL._String . to T.unpack返回组合的吸气剂,以便如果第一个失败,则尝试第二个?msum镜片像什么?