Haskell 理解权适用
对于列表,为什么Haskell 理解权适用,haskell,applicative,Haskell,Applicative,对于列表,为什么right apply(*>)会重复并追加第二个参数n次,其中n是第一个参数的长度 ghci> [1,2,3] *> [4,5] [4,5,4,5,4,5] 默认情况下,*>运算符定义为 xs *> ys = id <$ xs <*> ys 对于列表,这是 fs <*> as = [f a | f <- fs, a <- as] 你确定吗,它不是>?@thefourtheye*>是>,如果所讨论的应用程序也是一个单
right apply(*>)
会重复并追加第二个参数n
次,其中n
是第一个参数的长度
ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]
默认情况下,
*>
运算符定义为
xs *> ys = id <$ xs <*> ys
对于列表,这是
fs <*> as = [f a | f <- fs, a <- as]
你确定吗,它不是
>
?@thefourtheye*>
是>
,如果所讨论的应用程序也是一个单子。最后,效果是[1,2,3]
的每个元素都被[4,5]
替换,给出[4,5],[4,5],[4,5]
,然后用的concat将平铺成[4,5,4,5,4,5,4,5]
。如果您自己将其定义为xs*>ys=concat(map(const-ys)xs)
,则可以表明这与(*>)
的给定定义相同,也与(>>)
@ReinHenrichs,我需要正确地完成它并重写一些内容,但我现在感到奇怪的头晕,所以很难集中注意力。如果你想从
到*>
迈出最后一两步,请继续编辑。我试过了,但很难,所以当我看到你的答案时,我停了下来。:D这是一条相当迂回的道路@KevinMeredith,它有一个默认定义,所有的实现在语义上都应该与之相同(除了可能定义得更多)。但是有些类型(例如,Data.Sequence
)能够发挥神奇的作用,并提供比默认值更高效的*>
实现。@KevinMeredith Rein Henrichs版本通常可以使用更通用的函数进行重写:join(fmap(const ys)xs)
pure = return
fs <*> as = fs `ap` as = fs >>= \f -> as >>= \a -> f a
fs <*> as = [f a | f <- fs, a <- as]
newtype ZipList a = ZipList [a]
instance Applicative ZipList where
pure = repeat
(<*>) = zipWith ($)