我需要的签名是(Maybe a, b) -> (a, b)
,hoogle返回no results。
import Data.Maybe (fromJust)
fromJustTuple :: (Maybe a, b) -> (a, b)
fromJustTuple (a, b) = (fromJust a, b)
上下文是,我在Map
上使用updateLookupWithKey,我可以保证我查询的键存在。
let (Just x, myMap') = updateLookupWithKey f k myMap
,但这样我就不得不禁用incomplete-uni-patterns
,这是我不想做的。
退一步说,这可能是一个XY problem。我很高兴听到这样的消息,并了解到一个不同的,更惯用的方法。
2条答案
按热度按时间ix0qys7i1#
把我自己的评论抄成一个答案:
您可以将
fromJustTuple
写为first fromJust
(其中first
来自Control.Arrow)。first
具有类型签名:但是,忽略first的“箭头”部分,并假定它专用于函数,这可能是有意义的,这使它具有以下类型:
也就是说:它Map到元组的第一个元素上。
最后,我认为您的问题在于,虽然您“可以保证[您]查询的键存在”,但您无法向类型系统证明这一点,因此除非您可以更改这一点,否则您将不得不依赖
fromJust
这样的不安全函数,或者收到不完整模式匹配警告。envsm3lx2#
我认为困难的原因是
updateLookupWithKey
只是不是合适的工具,为什么不使用alterF
呢?现在,
Maybe
的唯一外观是覆盖Map
中实际上不存在该键的情况,并且在这种情况下,它将关联值默认为0。