<$><*> 符号是什么意思?

另外,我找到了一些关于 <$$> 的信息。

最佳答案

这些运算符在 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 类型类介于 FunctorMonad 之间:
class Functor where ...

class Functor f => Applicative f where ...

class Applicative m => Monad m where ...

(请注意,这是 ApplicativeMonad 之间的关系,仅在最近发布的 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/

10-11 04:22