我正在经历这些 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的上下文是如何工作的?
我们有:
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)
我们可以看到上面的签名是" 给从函数a到b以及从功能t到a,从返回一个函数t来b ".
现在你只需要实现它.:-)