在 Haskell 中, ((->) t) 在实例的类型签名中是什么意思?例如 Functor、Applicative 和 Monad 都有一个实例:
Functor ((->) r)
我找不到任何关于这种类型签名意味着什么的解释,而且它对搜索引擎的抵抗力很强。
在 Haskell 中, ((->) t) 在实例的类型签名中是什么意思?例如 Functor、Applicative 和 Monad 都有一个实例:
Functor ((->) r)
我找不到任何关于这种类型签名意味着什么的解释,而且它对搜索引擎的抵抗力很强。
->
是一个中缀类型构造函数。您可以将其与:
- 列表类型的中缀值构造函数进行比较。为了:
单独使用,我们在它周围加上括号,这样它就变成了一个前缀函数应用程序:
(:) a b
是相同的a : b
同理,函数的类型从到(->) a b
与 相同。a -> b
a
b
(->) a
是类型构造函数的部分应用,它本身是 kind 的类型构造函数* -> *
。
您可以将其视为“来自 a 的函数类型的构造函数”。例如(->) Int
,是来自 的函数类型的构造函数Int
。您可以通过将另一种类型传递给它来构造完整的函数类型:(->) Int String
是函数的类型 from Int
to String
。
instance Functor (->) a
是具有将函数fmap
转换为函数的操作的函子。您可以通过将参数应用于值来将其与映射到的类似内容进行比较。a -> b
a -> c
instance Functor (Either a)
Either a b
Either a c
fmap
Right
我们可以使用 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
r -> a
您可以将其视为r
固定的类型集。
仿函数是一个类型函数m
,这意味着对于任何类型a
,您都有一个类型m a
。例子Maybe
是[]
和(->) r
。后者也许应该写得更好(r ->)
,但我不知道这是否允许。