仿函数实例声明中的箭头运算符?

Bab*_*ham 2 haskell functor

我正在经历这些 Haskell'中间'练习,我做了以下实例:

class Fluffy f where
  furry :: (a -> b) -> f a -> f b

instance Fluffy [] where
  furry f [] = []

instance Fluffy Maybe where
  furry f (Just e) = Just (f e)
  furry f (Nothing) = Nothing
Run Code Online (Sandbox Code Playgroud)

但是,第三个问题语法让我难过:

instance Fluffy ((->) t) where
  ...
Run Code Online (Sandbox Code Playgroud)

我上的箭头操作阅读起来也看了答案,其中解释的作用,(->)在Monad的实例.但是我不太明白(->)Functors的上下文是如何工作的?

mel*_*ene 9

我们有:

class Fluffy f where
  furry :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

我们要定义:

instance Fluffy ((->) t) where
  furry = ...
Run Code Online (Sandbox Code Playgroud)

这意味着,在上述的实例中furry应当具有的类型(a -> b) -> f a -> f b,其中f((->) t),或换句话说:

furry :: (a -> b) -> ((->) t) a -> ((->) t) b
Run Code Online (Sandbox Code Playgroud)

就像((+) 2) 3它一样2 + 3,((->) X) Y它是相同的X -> Y(它的curried运算符应用程序,它甚至可以在类型级别工作):

furry :: (a -> b) -> (t -> a) -> (t -> b)
Run Code Online (Sandbox Code Playgroud)

我们可以看到上面的签名是" 给从函数ab以及从功能ta,从返回一个函数tb ".

现在你只需要实现它.:-)