[英]Monadic version of .~ (Haskell)
我正在尋找一個.~
的版本,它包含一個Monad包含的值並返回一個Monad。 例如:
(0, 1) & _1 .~ 100 = (100,1)
假設.~~
會:
(0, 1) & _1 .~~ return 100 = return (100,1)
雖然定義起來並不難,但是它已經在Lens包中的某個地方定義了嗎?
我不知道單個操作員是否真的像這樣,但通過一些“微小”調整,這基本上是鏡頭的原始應用。 調整是:
Monad
需要成為一個Functor
,幾乎所有人都是。 (這將是GHC 7.10的強制性要求,但尚未在7.8中完成。) 所以你可以這樣做:
Prelude Control.Lens> (0,1) & _1 (const (Just 100))
Just (100,1)
Prelude Control.Lens> (0,1) & _1 (const [100])
[(100,1)]
Prelude Control.Lens> (0,1) & _1 (const [100,200])
[(100,1),(200,1)]
甚至適用於Traversals
:
Prelude Control.Lens> (0,1) & both (const [100,200])
[(100,100),(100,200),(200,100),(200,200)]
如果您仍然需要運算符,則已定義%%~
運算符,但它實際上是id
的類型限制同義詞:
Prelude Control.Lens> (0,1) & _1 %%~ const (return 100) :: Either () (Int,Int)
Right (100,1)
最后,雖然你確實說它很簡單,你的.~~
操作符(我認為邏輯上是.%~
或類似的,如果它實際上是在lens
)可以定義為
Prelude Control.Lens> let (.~~) = (. const)
Prelude Control.Lens> (0,1) & _1 .~~ return 100 :: Either () (Int,Int)
Right (100,1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.