16

在 Haskell 中, ((->) t) 在实例的类型签名中是什么意思?例如 Functor、Applicative 和 Monad 都有一个实例:

Functor ((->) r)

我找不到任何关于这种类型签名意味着什么的解释,而且它对搜索引擎的抵抗力很强。

4

3 回答 3

19

->是一个中缀类型构造函数。您可以将其与:- 列表类型的中缀值构造函数进行比较。为了:单独使用,我们在它周围加上括号,这样它就变成了一个前缀函数应用程序:

(:) a b是相同的a : b

同理,函数的类型从到(->) a b与 相同。a -> bab

(->) a是类型构造函数的部分应用,它本身是 kind 的类型构造函数* -> *

您可以将其视为“来自 a 的函数类型的构造函数”。例如(->) Int,是来自 的函数类型的构造函数Int。您可以通过将另一种类型传递给它来构造完整的函数类型:(->) Int String是函数的类型 from Intto String

instance Functor (->) a是具有将函数fmap转换为函数的操作的函子。您可以通过将参数应用于值来将其与映射到的类似内容进行比较。a -> ba -> cinstance Functor (Either a)Either a bEither a cfmapRight

于 2013-09-01T19:30:08.320 回答
12

我们可以使用 lambda 函数和中缀函数:

(->) a    =    \b ->  (->) a b  --pseudo-Haskell
(->) a    =    \b ->  a -> b    --pseudo-Haskell

因此,将实例读为:

class Functor f where
   fmap :: (a->b) -> f a -> f b

instance Functor ((->)r) where
   fmap :: (a->b) -> f     a  -> f     b
         = (a->b) -> (->)r a  -> (->)r b   --pseudo-Haskell
         = (a->b) -> (r -> a) -> (r -> b)  --pseudo-Haskell
于 2013-09-01T20:16:14.230 回答
4

r -> a您可以将其视为r固定的类型集。

仿函数是一个类型函数m,这意味着对于任何类型a,您都有一个类型m a。例子Maybe[](->) r。后者也许应该写得更好(r ->),但我不知道这是否允许。

于 2013-09-01T19:31:43.333 回答