【发布时间】:2019-03-22 18:35:17
【问题描述】:
有没有更好的方法来使用函子或应用程序编写以下函数fs'?
fncnB = (* 2)
fncnA = (* 3)
fs' fs = zip (map (fncnA . fst) fs) $ map (fncnB . snd) fs
我从this question 看到,我可以依靠列表的函子实例来映射单个函数,该函数作用于每个元组的两个元素,或者例如在元组的应用实例上将函数应用于双元组的后半部分,但我很好奇仿函数和应用程序如何适应对多组件数据类型列表进行操作的情况。
【问题讨论】:
-
与 Functor 或 Applicative 无关,但您可以通过列表理解很好地重写它:
fs' fs = [(fncnA x, fncnB y) | (x, y) <- fs] -
或者,使用
Arrow方法,只需fs' = map (fncnA &&& fncnB)。 (我想。我对 Arrows 并没有真正的经验。) -
@RobinZigmond:正确的想法,错误的功能——你想要
(***)。(&&&)将用于((* 2) &&& (* 3)) 5 == (10,15)。 -
谢谢@AntalSpector-Zabusky,我知道我会在某个地方搞混 :)
标签: haskell functor applicative