我可以在没有箭头的情况下映射一对的第一个元素吗?

Ash*_*she 6 haskell arrows

我正在关注算子,应用函子...我不知道如何到达我想要的地方,但我觉得遵循这些类型应该让我更接近.

是否有一种简单的方法可以制作map仅适用于2元组的第一个元素的-alike?以firstControl.Arrow和使用Arrow (->),该做的伎俩很好:

map . first :: (b -> c) -> [(b, d)] -> [(c, d)]
Run Code Online (Sandbox Code Playgroud)

我唯一担心的是我还没有获得真正的箭头直觉,所以如果我坚持下去的话,我迟早会发现自己处于深水中.此外,这似乎是一个相当方便的案例,不能一概而论.

我可以通过使用仿函数,monad或其他任何东西来获得相同的功能,同时了解我想要的内容吗?我一直在玩弄

\f -> map (f `on` fst)
Run Code Online (Sandbox Code Playgroud)

类似的想法,但不能完全到达那里.

Don*_*art 9

箭头有很好的组合器可以在元组上运行.您几乎可以将它们视为缺少的元组函数!

所以,例如

> :t \f -> map (f *** id)
  :: (b -> c) -> [(b, c')] -> [(c, c')]
Run Code Online (Sandbox Code Playgroud)

是映射第一个组件的有用方法.

  • 您还可以使用(来自Control.Arrow)"map(first f)"将函数应用于对的第一个元素,并类似地"map(second f)"将其应用于第二个元素. (2认同)

mig*_*yte 5

可以做这种事情的另一个抽象是一个bifunctor.Edward Kmett有一个名为bifunctors的包. Data.Bifunctor具有完全符合此功能的类型类,它包含2元组的实例.