我所知道的只有一個可以工作,另一個不可以。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