Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 理解权适用_Haskell_Applicative - Fatal编程技术网

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 ($)