在Haskell中,(( - >)t)在实例的类型签名中意味着什么?例如,Functor,Applicative和Monad都有一个实例:
Functor ((->) r)
我找不到任何关于此类型签名的含义的解释,并且它具有高度的搜索引擎抗性。
答案 0 :(得分:19)
->
是一个中缀类型构造函数。您可以将它与:
- 列表类型的中缀值构造函数进行比较。要单独使用:
,我们在它周围加上括号,使它成为前缀函数应用程序:
(:) a b
与a : b
同样,(->) a b
与a -> b
相同,是a
到b
的函数类型。
(->) a
是类型构造函数的部分应用程序,它本身是类* -> *
的类型构造函数。
您可以将其视为"来自"的函数类型的构造函数。例如。 (->) Int
是来自Int
的函数类型的构造函数。您可以通过向其传递另一个类型来构造完整的函数类型:(->) Int String
是从Int
到String
的函数类型。
instance Functor (->) a
是一个带有fmap
操作的仿函数,将a -> b
函数转换为a -> c
函数。您可以通过将instance Functor (Either a)
参数应用于Either a b
值,将其与将Either a c
映射到fmap
的类似Right
进行比较。
答案 1 :(得分:10)
我们可以使用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
答案 2 :(得分:4)
您可以将其视为已修复r -> a
的{{1}}类型集。
仿函数是一种类型函数r
,这意味着对于任何类型m
,您都有a
类型。示例包括m a
,Maybe
和[]
。后者应该更好地写成(->) r
,但我不知道是否允许这样做。