2016-12-16 21 views

回答

5

您可以使用non :: Eq a => a -> Iso' (Maybe a) aEq a => Maybe a(see also)之間創建Iso

(Nothing, 2) ^. _1 . non (6, 5) . _1 == 6 
((Nothing, 2) & _1 . non (6, 5) . _1 .~ 7) == (Just (7, 5), 2) 
+0

文檔中的_caveat lector_:「請記住,如果將域視爲」可能(無s)「,那麼這只是一個真正的同構。 –

+0

是的,它意味着'((Nothing,2)&_1。non(6,5)。〜(6,5))==(Nothing,2)'或者一般情況下'(Nothing&non x。〜x )==沒什麼 – freestyle

0

是的,這似乎是可能的:

let 
    df :: Functor f => a -> (a -> f b) -> Maybe a -> f (Maybe b) 
    df d = lens (maybe d id) (const Just) 

(Just (4, 3), 2) ^. _1 . df (6, 5) . _1 `shouldBe` 4 
(Nothing,  2) ^. _1 . df (6, 5) . _1 `shouldBe` 6 

((Nothing,  2) & _1 . df (6, 5) . _1 .~ 7) `shouldBe` (Just (7, 5), 2) 
((Just (4, 3), 2) & _1 . df (6, 5) . _1 .~ 7) `shouldBe` (Just (7, 3), 2) 

注:我在重新認識的過程我自己與鏡頭,所以如果有人知道這樣做的更好的方式請告訴 - 例如如果有內置功能相當於df

+1

['non'](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Iso.html#v:non)(並且特別地確保閱讀有關這種同構的合法性的警告) –

+0

謝謝@DanielWagner。這有點令人尷尬。在我寫這個問題之前,我確實嘗試過使用'non',但由於某種原因,我試圖使用它:'(Nothing,2)^。 _1。非(Just(6,5))。 _1 == 6'導致類型錯誤。 – Wizek

相關問題