我正在尋找的簽名是(Maybe a, b) -> (a, b)hoogle 沒有回傳任何結果。我可以很容易地寫我自己的
import Data.Maybe (fromJust)
fromJustTuple :: (Maybe a, b) -> (a, b)
fromJustTuple (a, b) = (fromJust a, b)
背景關系是我在可以保證我正在查詢的鍵存在的地方使用updateLookupWithKey 。Map我可以說
let (Just x, myMap') = updateLookupWithKey f k myMap
,但后來我不得不禁用incomplete-uni-patterns,我不想這樣做。
稍微備份一下,這可能是一個XY 問題。我很高興聽到這樣的訊息,并了解了一種不同的、更慣用的方法。
uj5u.com熱心網友回復:
將我自己的評論復制到答案中:
你可以寫成fromJustTuple(first fromJust哪里first來自Control.Arrow)。
first具有型別簽名:
first :: Arrow a => a b c -> a (b, d) (c, d)
但是你可能忽略 first 的“箭頭”部分,并假裝它是專門用于函式的,這給它的型別可能是有意義的:
first :: (b -> c) -> (b, d) -> (c, d)
也就是說:它映射到元組的第一個元素。
最終,我認為您的問題是,盡管您“可以保證 [您] 查詢的鍵存在”,但您無法向型別系統證明這一點,因此除非您可以更改它,否則您將不得不依賴于不安全的函式fromJust,或者得到不完整的模式匹配警告。
uj5u.com熱心網友回復:
我認為困難的原因在于updateLookupWithKey它不是正確的工具。為什么不使用alterF?
import Data.Map (Map)
import qualified Data.Map as M
import Data.Maybe
update :: (Ord k, Num a) => (a -> a) -> k -> Map k a -> (a, Map k a)
update f = M.alterF (\old -> let new = f (fromMaybe 0 old) in (new, Just new))
incr :: (Ord k, Num a) => k -> Map k a -> (a, Map k a)
incr = update ( 1)
decr :: (Ord k, Num a) => k -> Map k a -> (a, Map k a)
decr = update (subtract 1)
現在唯一的外觀Maybe是覆寫鍵實際上不存在于 中的Map情況,并且在這種情況下它默認關聯的值為 0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528539.html
標籤:哈斯克尔
上一篇:運行沖突解釋器時出錯
