Haskell中(( - >)t)的含义是什么?

时间:2013-09-01 19:04:03

标签: haskell functional-programming

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

Functor ((->) r)

我找不到任何关于此类型签名的含义的解释,并且它具有高度的搜索引擎抗性。

3 个答案:

答案 0 :(得分:19)

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

(:) a ba : b

相同

同样,(->) a ba -> b相同,是ab的函数类型。

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

您可以将其视为"来自"的函数类型的构造函数。例如。 (->) Int是来自Int的函数类型的构造函数。您可以通过向其传递另一个类型来构造完整的函数类型:(->) Int String是从IntString的函数类型。

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 aMaybe[]。后者应该更好地写成(->) r,但我不知道是否允许这样做。