<$>
和 <*>
符号是什么意思?
另外,我找到了一些关于 <$
和 $>
的信息。
最佳答案
这些运算符在 Control.Applicative
中定义。 <$>
运算符只是 fmap
的一个中缀版本:
f <$> a = fmap f a
<*>
是 Applicative
类型类定义的一部分:class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
您可以使用 hoogle 更轻松地搜索 Haskell 函数和运算符。
Applicative
类型类介于 Functor
和 Monad
之间:class Functor where ...
class Functor f => Applicative f where ...
class Applicative m => Monad m where ...
(请注意,这是
Applicative
和 Monad
之间的关系,仅在最近发布的 GHC 7.10 中强制执行)应用程序是遵循特定规则的结构。它比仿函数更强大,但不如 monad 强大。具体来说,仿函数只能将单参数函数应用于结构中的值,返回包含新值但不包含新形状的新结构。规范示例是
fmap (+1) [1,2,3] == [2,3,4]
,输入列表的长度始终与输出列表的长度相同。使用 applicatives,您可以跨多个结构应用多参数纯函数:> (+) <$> [1, 2, 3] <*> [10, 20]
[11, 21, 12, 22, 13, 23]
输出列表的长度(它的“形状”)取决于输入列表的长度。但是,需要注意的是,输出列表的长度不取决于列表中的值。这是 monad 为这个层次结构添加的力量:
> print $ do a <- [1, 2, 3]; b <- replicate a 10; return (a + b)
[11, 12, 12, 13, 13, 13]
在这里,我们将两种结构组合在一起,其中一种具有依赖于另一种值的“形状”。这仅靠应用程序是不可能的,这就是为什么 monad 在 Haskell 中如此普遍的原因。但是,由于每个
Monad
都是 Applicative
并且每个 Applicative
都是 Functor
,因此在使用 Monad
时您仍然可以访问所有这些工具。关于haskell - 符号 <$> 和 <*> 在 Haskell 中是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29438118/