Functor / Applicative 可以绑定到一种特定的类型或结构吗?

Add*_*dem 9 haskell functor applicative

我试图理解应用类型类,尤其是<*>函数。现在我看到它的类型签名是f (a -> b) -> f a -> f b,我认为它f是一个函子,我认为它是包装一些数据的某种结构。这似乎对我来说,f必须处理泛型类型,特别是它必须能够对f具有参数化类型ab以及事实上它也必须支持a -> b

如果我的理解是正确的,那么我们正在做的是使用一个f最初打算包装一些数据的类型类,比如字符串列表或包含文件缓冲区的树或我们可能想要的任何随机事物。但是f不能被提交给任何一种类型,因为它不仅必须处理这样一种类型,而且还需要处理从数据到其他数据的函数。因此,如果我们有一个示例实现,<*>其中包含

Just2 f <*> j = fmap f j

读取它的方式是j在 a 中的某种数据Just2f是一个将数据映射到数据的函数。并且f被包裹在一个Just2.

这一切都对吗?从根本上说,我的问题是:任何应用程序都必须如此通用,以至于它可以始终同时处理任意数据并在数据之间运行吗?或者有什么方法可以让应用程序允许它内部的唯一数据是列表?

K. *_*uhr 8

是的,您的理解在很大程度上是正确的。特别是,任何特定的Applicative,比如一个 named Foo,都有一个相关的pure具有类型签名的函数的特化:

pure :: a -> Foo a
Run Code Online (Sandbox Code Playgroud)

必须适用于a调用者选择的任何类型,例如:

> pure 10 :: Foo Int
> pure length :: Foo (String -> Int)
Run Code Online (Sandbox Code Playgroud)

因此,无论如何Foo,它必须能够无限制地“处理”任何提供的类型,因为pure在技​​术上可以无限制地应用于任何类型。

不过,有一个警告。函子f“包装”数据的想法f Int在某种程度上是Int值的“容器” ,这可能是一种有用的直觉,并且通常是字面上正确的(例如,列表、树等),但并不总是严格正确的。(一些反例包括函子IO(->) rConst b,它们“包含”值的意义与真正的容器截然不同。)