99 Haskell问题#14

时间:2016-07-13 20:28:03

标签: haskell applicative

我对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]。

谢谢!

2 个答案:

答案 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 <*> vv <**> 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"

请记住,<*>序列操作。