2017-04-10 72 views
2

較短的方式是否有寫下面的代碼片段的短/清潔方式:遍歷嵌套的紀錄,也許

fromMaybe "" $ fmap (^. fullName) (bi ^. bookerContact) 

這裏bi ^. bookerContact可能導致Maybe Contact紀錄,這也是爲什麼要fmapped ^. fullName需求。在嵌套遍歷之後,如果我們以Nothing結尾,我們使用fromMaybe ""將其默認爲空字符串。

回答

4

整理它的一個簡單方法是使用maybe代替fromMaybe/fmap組合:

maybe "" (^. fullName) (bi ^. bookerContact) 

您還可以引入_Just棱鏡來表達所有的鑽下來作爲單個光學:

fromMaybe "" (bi ^? bookerContact . _Just . fullName) 

請注意,我們已從(^.)切換到(^?)。這反映瞭如何在連鎖上添加_Just將以前作爲鏡頭(並且恰好達到一個目標)的內容改變爲遍歷(可能不會達到目標)。


也可以採取Text優勢是一個獨異和使用來自Data.Foldablefold ...

fold (bi ^? bookerContact . _Just . fullName) 

...或者foldOf,如果你喜歡鏡頭拼寫:

foldOf (bookerContact . _Just . fullName) bi 

正如文檔指出的那樣,foldOf是equi價格爲(^.)(即view專門到(->)),所以這也將工作,通過摺疊Maybe Text

bi ^. bookerContact . _Just . fullName 
+0

嗯......我不清楚是怎麼型雙的'^。 bookerContact._Just.fullName'即將成爲'Text'。它不應該是'也許文本'? –

+0

'^。 _Just'在'Maybe Text'上可能會產生一個''''然而''。 _Just'超過'Maybe Int'會導致以下錯誤 - '由於使用'_Just''而沒有引發(Monoid Int)的實例是否有可能以遍歷整個遍歷的方式遍歷一個'Maybe'在不依賴於「Monoid」魔法的情況下產生'Maybe'? –

+0

@SaurabhNanda「魔法」是'Maybe Text'被摺疊(爲了比較,''「foo」,「bar」] ^。遍歷結果爲'「foobar」')。如果你喜歡得到'Maybe Text'而不是摺疊它,使用'(^?)'而不是'(^。)',就像答案中的第二和第三個變體一樣。 (根據你可以使用的魔法數量,在這種情況下,你可能會看到'foldOf'作爲對'(^。)'的改進) – duplode