99 个哈斯克尔问题 # 14



我有一个关于重复函数的一个实现的问题,如99个Haskell问题(https://wiki.haskell.org/99_questions/Solutions/14)中所述。

其中一个解决方案使用"应用"的列表实例。该特定解决方案是

duplicate = (<**> [id,id])

我想知道为什么,当我尝试实现重复作为

duplicate' = ([id,id] <*>)

我得到

duplicate' [1,2,3] = [1,2,3,1,2,3]

而不是 [1,1,2,2,3,3]。

谢谢!

[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 ]

发布的示例类似。

请记住,应用组合器首先执行第一个参数的效果。这里的"效果"大致是"从列表中绘制一个元素"。

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"

请记住,<*>对操作进行排序。

最新更新