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).
它在理论上似乎与应用仿函数相似,但有点倒退.
实际上,这是一个无聊的旧前锋应用程序; 特别是读者((->) 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)