是否可以在Haskell中的列表上映射函数元组?

Ben*_*ach 6 haskell tuples function applicative

我正试图找到一种方法来做这样的事情:

(head, last) `someFunction` [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

生成元组(1, 3)作为输出.

它在理论上似乎与应用仿函数相似,但有点倒退.我猜测有一个类似的功能可以做到这一点(或某种方式来做一个),但我似乎无法找到它/想出来.

我尝试定义这样的函数:

fmap' :: ((a -> b), (a -> b)) -> [a] -> (b, b)
fmap' (f1, f2) xs = (f1 xs, f2 xs)
Run Code Online (Sandbox Code Playgroud)

但GHC实际上不会编译这个.

任何帮助都会很棒; 谢谢!

编辑(整整一年后!):

fmap'不会编译,因为类型签名是错误的.显然有更好的方法来做我正在做的事情,但我的类型fmap'应该是:

fmap' :: ((a -> b), (a -> b)) -> a -> (b, b)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它编译并运行得很好.

Jef*_*rka 15

我想你可以用箭头做到这一点.

head &&& last $ [1,2,3]
Run Code Online (Sandbox Code Playgroud)

会回来的(1,3).

  • 需要`import Control.Arrow`. (3认同)

Dan*_*ner 9

它在理论上似乎与应用仿函数相似,但有点倒退.

实际上,这是一个无聊的旧前锋应用程序; 特别是读者((->) r).

Prelude Control.Applicative> liftA2 (,) head last [1,2,3]
(1,3)
Run Code Online (Sandbox Code Playgroud)

或者,如果你是这样的事情:

Prelude Control.Applicative> let sequenceA [] = pure []; sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
Prelude Control.Applicative> [head, last] `sequenceA` [1,2,3]
[1,3]
Run Code Online (Sandbox Code Playgroud)