我对99 Haskell问题(https://wiki.haskell.org/99_questions/Solutions/14)中描述的重复函数的一个实现有疑问。
其中一个解决方案使用Applicative的列表实例。那个特定的解决方案是
X...Y
我想知道为什么,当我尝试将副本实现为
时duplicate = (<**> [id,id])
我得到了
duplicate' = ([id,id] <*>)
而不是[1,1,2,2,3,3]。
谢谢!
答案 0 :(得分:2)
[f, g] <*> [x, y]
相当于
[ h w | h <- [f, g], w <- [x, y] ]
因此,我们得到了
[ f x, f y, g x, g y ]
比较
[x, y] <**> [f, g]
相当于
[ h w | w <- [x, y], h <- [f, g] ]
因此,我们得到了
[ f x, g x, f y, g y ]
发布的示例也是如此。
请记住,应用组合器首先执行第一个参数的效果。 &#34;效果&#34;这里大概是&#34;从列表中抽取一个元素&#34;。
答案 1 :(得分:1)
f <*> v
与v <**> f
不同。我们可以使用Either
:
import Control.Applicative ((<*>),(<**>))
f :: Either String (a -> b)
f = Left "f evaluated first"
v :: Either String a
v = Left "v evaluated first"
showE :: Show a => Either a b -> String
showE (Left x) = "Left: " ++ show x
showE (Right _) = "Right"
printE = putStrLn . showE
main = do
printE (f <*> v)
printE (v <**> f)
结果:
Left: "f evaluated first"
Left: "v evaluated first"
请记住,<*>
序列操作。