簡體   English   中英

Monadic版本.~(Haskell)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM