我试图使用镜头库来解决以下问题:
给定树的列表版本,创建一棵树。例子:
Given:
[1,2,3,4,5,6,7]
I should make a tree:
1
2 3
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
我的解决方案是使用状态单子和透镜根据深度创建节点。
我的树数据类型:
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我想要的一个字符串版本,用于计算镜片:
calculateSetters 1 = ["_Node . _2", "_Node . _3"]
calculateSetters n = (++) <$> calculateSetters (n-1) <*> [ "_Node . _2", "_Node . _3" ]
-- where "_Node" is a prism and "_2" and "_3" are lenses
Run Code Online (Sandbox Code Playgroud)
非拉丝版本会将所有镜头输出到给定深度的空孩子,我可以使用 进行设置.~。非字符串版本的要点如下:
calculateSetters n = Setter <$> combinations …Run Code Online (Sandbox Code Playgroud)