我所知道的只有一个可以工作,另一个不可以。Haskell镜头库中的`ix`和`at`有什么区别
上下文: 我有含有Data.Map.Map k S
到另一个数据结构S
一个数据结构F
。我的目标是建立一个Lens
,给定F
和k
将描述S
中的字段。
难点在于密钥k
可能不在地图中。这很好,函数可以在Maybe中包含它的返回值。但是我无法通过Maybe使用at
来传播镜头。在阅读了很多堆栈溢出的答案后,我碰到this one。
事实证明,与ix
更换at
解决了我的问题类型,如果我也(^?)
更换(^.)
。
问: 好像at
和ix
做同样的事情,至少对于Map
。双方都拿一把钥匙,并给这个钥匙上的价值赋予一个“镜头”。但是,ix
似乎与函数组合运算符(.)
打得很好。两者有什么区别?
关闭主题咆哮:
我喜欢缀运营商多为未来的家伙但在Control.Lens包似乎过火了一点。对于有一些英文名字和某处键的新用户来说,会降低学习曲线。由于镜头库中使用的包装类数量庞大,如果您不知道发生了什么,则特别难以挖掘类型签名。我的代码开始在天堂看起来像Perl。
你可以用'lens'没有一个单一的缀操作符。几乎每个运营商都只是一个非运营商名称的便捷别名 - 您不必使用它们(而我通常不会)。 – shachaf
你不能做的就是尝试阅读理解其他人编写的代码,比如库示例文件夹。在大多数其他库中,在GHCi中复制一些代码并在其上跳动的过程显然比较困难。 –
@shachaf这不是真的:某些非常有用的操作符不是以单词的形式存在的,即'%='(因为它在'do'块中使用而不是很糟糕)和'?〜'(非常糟糕,因为它在纯代码,如果你不想加载parens,需要从'$'切换到'&')。 – spopejoy